需求使用TCP通信的方式实现:多发多收消息
具体要求
可以使用死循环控制服务端收完消息继续等待接收下一个消息
客户端也可以使用死循环等待用户不断的输入消息
客户端一旦输入exit,则关闭客户端程序,并释放资源
先启动接收端
package TCP多发多收;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
public class Myserver {
public static void main(String[] args) throws Exception{
System.out.println("----接收端------");
//注册端口
ServerSocket ssK=new ServerSocket(8899);
//创建接收端
Socket sk=ssK.accept();
//获取输入流
InputStream is=sk.getInputStream();
//封装成高级流
BufferedReader bfr=new BufferedReader(new InputStreamReader(is));
String read;
while((read=bfr.readLine())!=null) {
System.out.println("来自ip:"+sk.getRemoteSocketAddress()+"端口号:"+sk.getPort()+"的消息:"+read);
}
}
}
发送端
package TCP多发多收;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.Socket;
import java.util.Scanner;
public class MyClient {
public static void main(String[] args) throws Exception{
System.out.println("---------发送端------");
// 创建发送端对象
Socket sk=new Socket("127.0.0.1", 8899);
//创建发送管道
OutputStream is=sk.getOutputStream();
//封装成高级管道
PrintStream ps=new PrintStream(is);
Scanner sc=new Scanner(System.in);
while(true)
{
System.out.println("请您输入数据:");
String s=sc.nextLine();
if("exit".equals(s)) {
System.out.println("退出成功");
ps.close();
break;
}
ps.println(s);//发送数据
ps.flush();//刷新管道
}
}
}
本次多发多收是如何实现的?
客户端使用循环反复地发送消息
服务端使用循环反复地接收消息
现在服务端为什么不可以同时接收多个客户端的消息?
目前服务端是单线程打的,每次只能处理一个客户端的消息
那么如何实现服务端接收多个客户端的消息呢?
主线程定义循环负责接收客户端Socke管道连接
每接收一个Socket通信管道分配一个独立的线程负责处理它。
创建一个线程类
package TCP多发多收;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
public class Myserver {
public static void main(String[] args) throws Exception{
System.out.println("----接收端------");
//注册端口
ServerSocket ssK=new ServerSocket(1314);
//创建接收端,每来一个接收端,就交给一个子线程
while(true) {
Socket sk=ssK.accept();
System.out.println(sk.getRemoteSocketAddress()+"上线了");
new MymessageThread(sk).start();;
}
}
}
然后只需优化一下接收端即可
package TCP多发多收;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.Socket;
/**
* 接收消息线程类
*/
public class MymessageThread extends Thread {
private Socket socket;
public MymessageThread(Socket socket) {
this.socket=socket;
}
@Override
public void run() {
try {
//获取输入流
InputStream is=socket.getInputStream();
//封装成高级流
BufferedReader bfr=new BufferedReader(new InputStreamReader(is));
String read;
while((read=bfr.readLine())!=null) {
System.out.println("来自ip:"+socket.getRemoteSocketAddress()+"端口号:"+socket.getPort()+"的消息:"+read);
}
} catch (IOException e) {
System.out.println(socket.getRemoteSocketAddress()+"下线了");
}
}
}