JAVA Tcp多对多通信实现
·
在上一篇文章中已经实现了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());
}
}
}
服务器端的管道一般不需要关闭,好比百度的服务器端的管道就是一直开发的。
更多推荐




所有评论(0)