学习Java第二十一天(二):使用多线程+TCP实现简单聊天程序

1、使用多线程+TCP实现简单聊天程序

        能跑但是少注释!!!

public class ClientChat {
    public static void main(String[] args) throws IOException {
​
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        System.out.println("请输入服务器ip:");
        String serverIp = reader.readLine();
        Socket client = new Socket(serverIp, 3000);
        boolean flag = true;
        OutputStream outputStream = client.getOutputStream();
        InputStream inputStream = client.getInputStream();
        String userName = "";
        //循环判断用户名是否重复
        while(flag) {
            System.out.println("请输入用户名:");
            userName = reader.readLine();
            String userNameInfo = "name-" + userName;
            outputStream.write(userNameInfo.getBytes());
            byte[] bytes = new byte[1024];
            int len = inputStream.read(bytes);
            String serverInfo = new String(bytes, 0, len);
            if (serverInfo.equals("yes")) {
                flag = false;
            }
        }
        System.out.println("欢迎" + userName + "进入聊天程序");
        System.out.println("[@所有人---【public-用户名-具体内容-时间】]");
        System.out.println("[@退出---【exit】]");
        ClientThread clientThread = new ClientThread(inputStream);
        clientThread.start();
​
        boolean flagIo = true;
        while(flagIo){
            String sendInfo = "";
            System.out.println("请输入内容");
            String context = reader.readLine();
            String[] split = context.split("-");
            if(split[0].equals("public")) {
                //public-用户名-具体内容-时间
                sendInfo = "public-" + userName + "-" + split[1] + "-" + getTime();
            }
            if(split[0].equals("exit")){
                sendInfo = "exit-" + userName + "-" + getTime();
            }
​
            outputStream.write(sendInfo.getBytes());
        }
        reader.close();
        inputStream.close();
        outputStream.close();
        client.close();
        clientThread.stop();
    }
    /**
     * 格式化时间
     * @return
     */
    private static String getTime() {
        return new SimpleDateFormat("yyyy/MM/dd HH:mm:ss E").format(new Date());
    }
}
public class ClientThread extends Thread{
​
    private InputStream inputStream;
    public ClientThread(InputStream inputStream){
        this.inputStream= inputStream;
    }
    @Override
    public void run() {
        boolean flag = true;
        try {
            while(flag){
                byte[] bytes = new byte[1024];
                int len = inputStream.read(bytes);
                String s = new String(bytes, 0, len);
                System.out.println("接收的信息:" + s);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
        }
    }
}
public class ServerChat {
    public static void main(String[] args) throws IOException {
        Map<String,Socket> userList = new HashMap<>();
        ServerSocket serverSocket = new ServerSocket(3000);
        System.out.println("====服务器已经启动====");
        boolean flag = true;
        while(flag){
            Socket client = serverSocket.accept();
            ServerThread serverThread = new ServerThread(client, userList);
            serverThread.start();
        }
    }
}
public class ServerThread extends Thread {
    private Socket client;
    private Map<String,Socket> userList;
​
    public ServerThread(Socket client,Map<String,Socket> userList){
        this.client = client;
        this.userList = userList;
    }
​
    boolean flag = true;
    private String serverMs = "";
​
    @Override
    public void run() {
        InputStream inputStream = null;
        OutputStream outputStream = null;
        try {
            inputStream = client.getInputStream();
            outputStream = client.getOutputStream();
            byte[] bytes = new byte[1024];
            while(flag){
                int len = inputStream.read(bytes);
                String result = new String(bytes, 0, len);
                String[] split = result.split("-");
                if(split[0].equals("name")){
                    System.out.println("用户名---" + split[1]);
                    if(userList.containsKey(split[1])){
                        serverMs = "no";
                    }else{
                        serverMs = "yes";
                        userList.put(split[1],client);
                    }
                    outputStream.write(serverMs.getBytes());
                }
​
                //public-用户名-具体内容-时间
                if(split[0].equals("public")){
                    serverMs = split[1] + "@所有人:" + split[2] + "  " + split[3];
                    Collection<Socket> socketList = userList.values();
                    for (Socket socket : socketList) {
                        OutputStream outputStream1 = socket.getOutputStream();
                        outputStream1.write(serverMs.getBytes());
​
                    }
                }
                //exit-用户名-时间
                if(split[0].equals("exit")){
                    serverMs = split[1] + "@所有人:已经离开" + split[2];
                    Collection<Socket> socketList = userList.values();
                    for (Socket socket : socketList) {
                        OutputStream outputStream1 = socket.getOutputStream();
                        outputStream1.write(serverMs.getBytes());
                    }
                    //删除map中的当前用户
                    userList.remove(split[1]);
                    flag = false;
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try{
                this.client.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                inputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                outputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
C语言中的多线程和网络编程可以结合起来实现多客户端网络聊天功能。多客户端网络聊天是指多个客户端之间通过网络进行实时的文字交流。 实现多客户端网络聊天功能的关键是使用多线程。在服务器端,可以创建一个主线程用于接收客户端的连接请求,并为每个连接创建一个新的子线程。每个子线程负责与一个客户端进行通信。这样就可以实现同时处理多个客户端的请求,实现多人聊天功能。 在C语言中,可以使用socket函数库进行网络编程。服务器端需要创建一个socket并绑定一个端口号,然后通过listen函数来监听客户端的连接请求。当有客户端连接到服务器时,主线程可以通过accept函数接收连接请求,并创建一个新的子线程来处理该客户端的请求。 在子线程中,可以使用send和recv函数与客户端进行通信。当有客户端发送消息时,服务器端的子线程可以接收到消息并广播给其他客户端,实现多人聊天功能。服务器端可以使用一个数据结构(如数组)来保存所有连接的客户端的socket,以便于广播消息。 客户端也需要创建一个socket,并连接到服务器端。连接成功后,客户端可以通过send函数向服务器端发送消息,通过recv函数接收其他客户端发送的消息,并显示在界面上。 总之,通过C语言中的多线程和网络编程,可以实现多客户端网络聊天功能。服务器端需要使用主线程接收连接请求并创建子线程与客户端进行通信,客户端通过socket与服务器端连接,发送和接收消息实现多人聊天功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

互联网农民工001

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值