• TCP通信实现:多发多收消息、实现可以同时接收多个客户端


    客户端

    1. package com.csdn.d5_socket2;
    2. import java.io.IOException;
    3. import java.io.OutputStream;
    4. import java.io.PrintStream;
    5. import java.net.Socket;
    6. import java.util.Scanner;
    7. /**
    8. * 目标:完成 Socket 客户端开发,实现 多发 和 多收
    9. */
    10. public class ClientDemo1 {
    11. public static void main(String[] args) {
    12. try{
    13. System.out.println("===客户端启动===");
    14. //1、创建Socket通信管道请求有服务端的连接
    15. Socket socket = new Socket("127.0.0.1", 7777);
    16. //2、从socket通信管道中得到一个字节输出流 负责发送数据
    17. OutputStream os = socket.getOutputStream();
    18. //3、把低级的字节流包装成打印流
    19. PrintStream ps = new PrintStream(os);
    20. Scanner sc = new Scanner(System.in);
    21. while (true) {
    22. System.out.println("请说:");
    23. String msg = sc.nextLine();
    24. //4、发送消息
    25. ps.println(msg);
    26. ps.flush();
    27. }
    28. } catch (IOException e) {
    29. throw new RuntimeException(e);
    30. }
    31. }
    32. }

     服务端

    1. package com.csdn.d5_socket2;
    2. import java.io.BufferedReader;
    3. import java.io.IOException;
    4. import java.io.InputStream;
    5. import java.io.InputStreamReader;
    6. import java.net.ServerSocket;
    7. import java.net.Socket;
    8. /**
    9. * 目标:实现 服务端 可以同时处理 多个客户端 的消息
    10. */
    11. public class ServerDemo2 {
    12. public static void main(String[] args) {
    13. try {
    14. System.out.println("===服务端启动成功===");
    15. //1、注册端口
    16. ServerSocket serverSocket = new ServerSocket(7777);
    17. //a.定义一个死循环由主线程负责不断的接收客户端的Socket管道连接
    18. while (true) {
    19. //2、每接收到一个客户端的Socket管道,交给一个独立的子线程负责读取消息
    20. Socket socket = serverSocket.accept();
    21. //上线逻辑
    22. System.out.println(socket.getRemoteSocketAddress() + "它来了,上线了!");
    23. //3、开始创建独立线程处理socket
    24. new ServerReaderThread(socket).start();
    25. }
    26. } catch (IOException e) {
    27. throw new RuntimeException(e);
    28. }
    29. }
    30. }
    31. class ServerReaderThread extends Thread {
    32. private Socket socket;
    33. public ServerReaderThread(Socket socket) {
    34. this.socket = socket;
    35. }
    36. @Override
    37. public void run() {
    38. try {
    39. //3、从socket通信管道中得到一个字节输入流
    40. InputStream is = socket.getInputStream();
    41. //4、把字节输入流包装成缓冲字符输入流进行消息的接收
    42. BufferedReader br = new BufferedReader(new InputStreamReader(is));
    43. //5、按照行读取消息
    44. String msg;
    45. while ((msg = br.readLine()) != null) {
    46. System.out.println(socket.getRemoteSocketAddress() + "说了:" + msg);
    47. }
    48. } catch (IOException e) {
    49. System.out.println(socket.getRemoteSocketAddress() + "下线了!!!");
    50. }
    51. }
    52. }

  • 相关阅读:
    使用mybatis实现CRUD(超详细)
    Python 基于 Yolov8 + CPU 实现物体检测
    包装类?为什么需要包装类?
    如何提取差异脑区的灰质体积与临床量表算相关?——基于体素的形态学方法(VBM)
    协同过滤推荐算法UserCF、ItemCF
    Vue3--Vue Router详解--学习笔记
    pwd和dirname命令的区别
    闭关之 Vulkan 应用开发指南笔记(一):概述、内存和资源
    反射获取AQS中同步队列与等待队列的长度
    Security源码学习
  • 原文地址:https://blog.csdn.net/m0_65152767/article/details/133934807