第二次课:通信程序的改进

第一部分:客户端

1、程序结构图

2、创建一个用于读取消息的线程

package cn.shxy.net;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;

/**
 * 专门用于读取数据的线程类
 *
 * @author John
 *
 */
public class ReadMessageThread extends Thread {
    //与服务器通信的套接字
    private Socket server;

    //构造函数
    public ReadMessageThread(Socket socket) {
        server = socket;
    }

    @Override
    public void run() {
        System.out.println("读取消息的线程已启动...");
        try {
            //获取输入流对象
            BufferedReader reader = new BufferedReader(new InputStreamReader(server.getInputStream()));
            //循环读取服务器发送的消息,循环条件是套接字没有关闭
            while (!server.isClosed()) {
                //读取一行消息
                String message = reader.readLine();
                //将消息显示出来
                System.out.println(server.getInetAddress() + ":" + server.getPort() + ":" + message);

                //如果是退出消息,则关闭套接字
                if (message.equalsIgnoreCase("quit")) {
                    server.close();
                    break;
                }
            }
        } catch (IOException e) {
        }
    }
}

3、修改主程序的代码,加上获取用户输入的循环

package cn.shxy.net;

import java.io.IOException;
import java.io.PrintStream;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;

public class TCPClient {
    //主函数
    public static void main(String[] args) throws UnknownHostException, IOException{
        new TCPClient();
    }

    //套接字
    private Socket server;

    //构造函数
    public TCPClient() throws UnknownHostException, IOException{
        //与服务器相连
        server = new Socket("127.0.0.1", 65535);

        ReadMessageThread readMessageThread = new ReadMessageThread(server);
        readMessageThread.start();

        PrintStream printer = new PrintStream(server.getOutputStream());

        @SuppressWarnings("resource")
        Scanner scanner = new Scanner(System.in);

        while(!server.isClosed()){
            String cmd = scanner.nextLine();
            printer.println(cmd);

            if(cmd.equalsIgnoreCase("quit")){
                server.close();
                break;
            }
        }
    }
}

第二部分:服务器端程序

1、结构图

2、编写和客户端相同的用于读取消息的线程

package cn.shxy.net;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;

/**
 * 专门用于读取数据的线程类
 * @author John
 *
 */
public class ReadMessageThread extends Thread {
    private Socket client;

    public ReadMessageThread(Socket socket){
        client = socket;
    }

    @Override
    public void run(){
        System.out.println("读取消息的线程已启动...");
        try {
            BufferedReader reader = new BufferedReader(new InputStreamReader(client.getInputStream()));
            while(!client.isClosed()){
                String message = reader.readLine();
                System.out.println(client.getInetAddress() + ":" + client.getPort() + ":" + message);
                if(message.equalsIgnoreCase("quit")){
                    client.close();
                    break;
                }
            }
        } catch (IOException e) {

        }
    }
}

3、修改主程序,加上循环获取输入命令的语句

package cn.shxy.net;

import java.io.IOException;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;

public class TCPServer {
    //主函数
    public static void main(String[] args) throws IOException{
        new TCPServer();
    }

    //服务器套接字
    private ServerSocket serverSocket;
    //客户端套接字
    private Socket client;

    //构造函数
    public TCPServer() throws IOException{
        //实例化服务器套接字
        serverSocket = new ServerSocket(65535);
        //接受客户端连接
        client = serverSocket.accept();

        //开启读取消息的线程
        ReadMessageThread readMessageThread = new ReadMessageThread(client);
        readMessageThread.start();

        //获取输出流对象
        PrintStream printer = new PrintStream(client.getOutputStream());
        //获取输入命令
        @SuppressWarnings("resource")
        Scanner scanner = new Scanner(System.in);

        //循环
        while(!client.isClosed()){
            //获取用户输入的命令
            String cmd = scanner.nextLine();
            //将命令发送给客户端
            printer.println(cmd);

            //如果是退出命令,则关闭套接字,结束程序
            if(cmd.equalsIgnoreCase("quit")){
                client.close();
                break;
            }
        }

    }
}

注意:运行程序时,应该先启动服务器端程序,后启动客户端程序!

时间: 2024-10-31 00:06:55

第二次课:通信程序的改进的相关文章

转:Qt编写串口通信程序全程图文讲解

转载:http://blog.csdn.net/yafeilinux/article/details/4717706  作者:yafeilinux (说明:我们的编程环境是windows xp下,在Qt Creator中进行,如果在Linux下或直接用源码编写,程序稍有不同,请自己改动.) 在Qt中并没有特定的串口控制类,现在大部分人使用的是第三方写的qextserialport类,我们这里也是使用的该类.我们可以去 http://sourceforge.net/projects/qextser

Qt编写串口通信程序全程图文解说

(说明:我们的编程环境是windows xp下,在Qt Creator中进行,假设在Linux下或直接用源代码编写,程序稍有不同,请自己修改.) 在Qt中并没有特定的串口控制类,如今大部分人使用的是第三方写的qextserialport类,我们这里也是使用的该类.我们能够去 http://sourceforge.net/projects/qextserialport/files/ 进行下载,也能够去下载我上传到网上的: http://download.csdn.net/source/176278

[多线程通信程序]C++基于Socket的一款多人在线通信程序

废话不多说,先上图. 进入正题:最近闲着无聊,想起来在初二时用VB写的一个局域网多人聊天室.当时用的是Winsock,然后写出来给同学上信息课用,其实也没啥用啊. 今天下午突发奇想,打算用C++实现这一功能.去百度了一下相关资料,才发现C++的socket是真的麻烦......(或许是我太菜了)于是于是于是,我很认真地开始学习(Copy).找了好久都没找到符合我意思的模板,而且突然发现如果要多人同时在线聊天的话,好像还要多线程来着,,???,,.于是我开始很认真的学习(别说了,是真的开始学习).

iOS-马上着手开发iOS应用应用程序-第二部分构建应用程序

第二部分构建应用程序 1,应用程序开发过程 2,设计用户界面 3,定义交互 4,教程:串联图 1,应用程序开发过程 定义概念 设计用户界面 定义交互 实现行为整合数据 对象是应用程序的基石 类是对象的蓝图 对象通过消息通信 协议定义消息发送契约 整合数据 消息通信: 在 Objective-C 中,虽然可使用多种方法在对象之间发送消息,但是目前最常用的方法是使用方括号的基本语法.如果您有一个 Person 类的对象 somePerson,那么可以按照如下所述来向它发送消息 sayHello: [

七月算法12月机器学习在线班---第二十次课笔记---深度学习--RNN

七月算法12月机器学习在线班---第二十次课笔记---深度学习--RNN 七月算法(julyedu.com)12月机器学习在线班学习笔记http://www.julyedu.com 循环神经网络 复习之前的知识点: 全连接前向网络: 学习出来的是函数 卷积网络:卷积操作,部分链接,共享操作,逐层提取原始图像的特征(语音,NLP) 学习出来的特征 局部相关性 浅层宽网络很难做成神经网络 ? 1.1状态和模型 1, ID数据 ·分类问题 ·回归问题 ·特征表达 2, 大部分数据都不满足ID ·大部分

三周第二次课(12月26) 3.4 usermod命令 3.5 用户密码管理 3.6 mkpasswd命令

三周第二次课(12月26) 3.4 usermod命令3.5 用户密码管理3.6 mkpasswd命令 usermod命令: 用户和工作组管理: usermod命令用于修改用户的基本信息. usermod命令不允许你改变正在线上的使用者帐号名称. 当usermod命令用来改变user id, 必须确认这名user没在电脑上执行任何程序. 你需手动更改使用者的crontab档. 也需手动更改使用者的at工作档. 采用NIS server须在server上更动相关的NIS设定. 语法: usermo

一周第二次课(3月20日)笔记

一周第二次课(3月20日) 1.6/1.7 配置IP 1.8 网络问题排查 1.6/1.7 配置IP 配置IP的作用:1.使虚拟机可以和外部通信,通过远程连接虚拟机 2.使虚拟机可以上网 配置IP的步骤: 1.自动获取IP # dhclient   自动获取IP(类似于电脑中dhcp自动获取IP地址) 2.查看IP 正常情况下dhclient命令执行后不会有任何信息反馈,因此需要用其他命令查看执行结果(查看IP) # ip address  查看IP地址 可简写为# ip addr 通过这个命令

二周第二次课

二周第二次课(8月8日) 2.10 环境变量2.11 cp命令2.12 mv命令2.13 文档查看cat/more/less/head/tail 由于之前看过老师第一版视频 PATH 自己个人理解就是 命令的路径变量,要查看命令变量PATH里的路径  echo $PATH,要修改/添加$PATH,①可以直接修改$PATH文件 /etc/profile 添加 PATH=$PATH:/etc/apache/bin  ②直接写入 PATH=$PATH:/etc/apache/bin>$PATH(这个情

老男孩linux实战培训初级班第二次课前考试题

################################################################ 本文内容摘录于老男孩linux实战运维培训中心课前考试题(答案部分) 如有转载,请务必保留本文链接及版权信息. 欢迎广到运维兄弟一起交流linux/unix网站运维技术! 网站运维交流群:114580181 45039636 37081784  老男孩 QQ:31333741  mail:[email protected] ======================