在上一篇文章中已经实现了Tcp一对一通信,其中一些注意事项也已说明,接下来实现的是Tcp多对多通信。

客户端:

package com.itheima.demo6tcp3;

import java.io.DataOutputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;

public class TcpClientDemo1 {
    public static void main(String[] args) throws Exception {
        //目标:实现TCP多对多通信,客户端开发
        System.out.println("客户端启动了");
        //1、创建Socket对象,构造方法中绑定地址和端口号
        Socket socket = new Socket("127.0.0.1",9999);
        //2、获取一个输出流,写数据
        OutputStream os = socket.getOutputStream();
        //3、包装成特殊数据流
        DataOutputStream dos = new DataOutputStream(os);
        Scanner sc = new Scanner(System.in);
        while (true) {
            System.out.println("请说:");
            String msg = sc.nextLine();
            if("exit".equals(msg)){
                System.out.println("退出成功");

                dos.close();
                socket.close();
                break;
            }
            dos.writeUTF(msg);
            dos.flush();
        }
    }
}

当客户端输入exit时关闭管道,结束通信

服务器端:为了实现多对多通信,我们可以将每一个客户端的连接交给一个线程来处理

package com.itheima.demo6tcp3;

import java.io.DataInputStream;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class TcpServerDemo2 {
    public static void main(String[] args) throws Exception {
        //目标:实现TCP多对多通信,服务器端开发
        System.out.println("服务端启动了");
        //1、创建一个服务器Socket对象,构造方法中绑定端口号
        ServerSocket ss = new ServerSocket(9999);
        //2、每有一个客户端连接,就创建一个子线程接受
        while (true) {
            Socket socket = ss.accept();
            System.out.println("一个客户端连接了"+socket.getInetAddress().getHostAddress());
            new ServerReader(socket).start();
        }
    }
}

我们将客户端的请求交给ServerReader这个线程来处理

package com.itheima.demo6tcp3;

import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.Socket;

public class ServerReader extends Thread{
    private  Socket socket;
    public ServerReader(Socket socket) {
        this.socket = socket;
    }
    @Override
    public void run() {
        try {
            //3、获取输入流,读取数据
            InputStream is = socket.getInputStream();
            //4、包装成特殊数据输出流
            DataInputStream dis = new DataInputStream(is);
            while (true) {
                String msg = dis.readUTF();
                System.out.println("收到客户端发的"+msg);
                //5、获取IP地址和端口号
                System.out.println("客户端的IP地址:"+socket.getInetAddress().getHostAddress());
                System.out.println("客户端的端口:"+socket.getPort());
                System.out.println("---------------------------------");
            }
        } catch (Exception e) {
            System.out.println("客户端断开连接"+socket.getInetAddress().getHostAddress());
        }
    }
}

服务器端的管道一般不需要关闭,好比百度的服务器端的管道就是一直开发的。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐