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

客户端

java 复制代码
package com.csdn.d5_socket2;

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

/**
 * 目标:完成 Socket  客户端开发,实现 多发 和 多收
 */
public class ClientDemo1 {
    public static void main(String[] args) {

        try{
            System.out.println("===客户端启动===");
            //1、创建Socket通信管道请求有服务端的连接
            Socket socket = new Socket("127.0.0.1", 7777);
            //2、从socket通信管道中得到一个字节输出流 负责发送数据
            OutputStream os = socket.getOutputStream();
            //3、把低级的字节流包装成打印流
            PrintStream ps = new PrintStream(os);

            Scanner sc = new Scanner(System.in);
            while (true) {
                System.out.println("请说:");
                String msg = sc.nextLine();
                //4、发送消息
                ps.println(msg);
                ps.flush();
            }

        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}

服务端

java 复制代码
package com.csdn.d5_socket2;

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

/**
 * 目标:实现 服务端 可以同时处理 多个客户端 的消息
 */
public class ServerDemo2 {
    public static void main(String[] args) {

        try {
            System.out.println("===服务端启动成功===");
            //1、注册端口
            ServerSocket serverSocket = new ServerSocket(7777);
            //a.定义一个死循环由主线程负责不断的接收客户端的Socket管道连接
            while (true) {
                //2、每接收到一个客户端的Socket管道,交给一个独立的子线程负责读取消息
                Socket socket = serverSocket.accept();
                //上线逻辑
                System.out.println(socket.getRemoteSocketAddress() + "它来了,上线了!");
                //3、开始创建独立线程处理socket
                new ServerReaderThread(socket).start();

            }

        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}

class ServerReaderThread extends Thread {
    private Socket socket;

    public ServerReaderThread(Socket socket) {
        this.socket = socket;
    }
    @Override
    public void run() {
        try {
            //3、从socket通信管道中得到一个字节输入流
            InputStream is = socket.getInputStream();
            //4、把字节输入流包装成缓冲字符输入流进行消息的接收
            BufferedReader br = new BufferedReader(new InputStreamReader(is));
            //5、按照行读取消息
            String msg;
            while ((msg = br.readLine()) != null) {
                System.out.println(socket.getRemoteSocketAddress() + "说了:" + msg);
            }
        } catch (IOException e) {
            System.out.println(socket.getRemoteSocketAddress() + "下线了!!!");
        }
    }
}
相关推荐
yanlou2333 分钟前
【C++/Linux实战项目】仿muduo库实现高性能Reactor模式TCP服务器(深度解析)
linux·服务器·c++·tcp/ip·epoll
我在人间贩卖青春5 分钟前
Socket套接字与TCP实现框架
网络·网络协议·tcp/ip·socket
李少兄6 分钟前
FHIR 资源查询实战指南:从 HTTP 接口到 Java 客户端的完整实现
java·网络协议·http
源远流长jerry20 分钟前
dpdk之tcp代码案例
服务器·网络·tcp/ip
Knight_AL21 分钟前
深入理解 ZLMediaKit HTTP Hook 机制
网络·网络协议·http
北京耐用通信21 分钟前
水处理PH监测难题如何破?耐达讯自动化Profibus光纤链路模块来解答
人工智能·科技·物联网·网络协议·自动化·信息与通信
上海云盾安全满满26 分钟前
高防IP怎样应对复杂CC攻击
网络·网络协议·tcp/ip
SongYuLong的博客10 小时前
TL-WR710N-V2.1 硬改刷机OpenWRT源码编译固件
linux·物联网·网络协议
AUTOSAR组织15 小时前
深入解析AUTOSAR框架下的TCP/IP协议栈
网络协议·tcp/ip·汽车·autosar·软件架构·软件·培训
googleccsdn15 小时前
ENSP Pro LAB笔记:配置M-LAG双归接入三层网络(V-STP + Monitor Link + OSPF)
网络·笔记·网络协议