TCP/UDP长连接的误区:
对于TCP来说,属于连接式通信协议。需要实例化ServerSocket对象,通过serverSocket.accept()来建立阻塞,同时还可以通过bind方法来绑定服务端IP和PORT代码如下:
服务端:
packagecom.example.springbootkafka2;importcom.example.serverconfig.ServerConfig;importlombok.SneakyThrows;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.boot.ApplicationArguments;importorg.springframework.boot.ApplicationRunner;importorg.springframework.core.Ordered;importorg.springframework.stereotype.Component;import java.net.*;import java.io.*;importjava.util.List;importjava.util.concurrent.LinkedBlockingQueue;
@Componentpublic class ServerSocket1 implementsApplicationRunner, Ordered {
@AutowiredprivateConfig config;
@AutowiredprivateServerConfig serverConfig;
@AutowiredprivateProducer producer;//监听的端口号和ip
private intPORT;privateString IP;inti;
String ip;
String message;//定义list集合
Listlist;
@Overridepublic void run(ApplicationArguments args){//实现ApplicationRunner, Ordered接口中的run方法
PORT =serverConfig.getPort();
IP=serverConfig.getIp();
list=config.getTopicList();
init();//开启服务端线程
}
@Overridepublic intgetOrder() {return 0;
}private voidinit(){new Thread(newtest1()).start();
}//开启一个test1线程
private class test1 implementsRunnable{privateString topic;
@Overridepublic voidrun() {try{
ServerSocket serverSocket= newServerSocket();
serverSocket.bind(newInetSocketAddress(IP,PORT));while(true){
Socket client=serverSocket.accept();//获取客户端的IP
InetAddress ia=client.getInetAddress();
ip=ia.getHostAddress();
System.out.println("客户端ip:"+ip);//..........................................................................//判断当前客户端是否与服务端有相匹配的IP port topic
int size =list.size();for( i=0 ;i
System.out.println("匹配成功,进行链接"+list.get(i).getIp());
topic=list.get(i).getTopic();//一个客户端连接就开户一个线程处理
new Thread(newHandlerThread(client,topic)).start();break;
}else{
System.out.println("对不起,没有匹配的" +list.get(i).getIp());
}
}
}//...........................................................................
} catch(IOException e) {
System.out.println("服务器异常:" +e.getMessage());
}
}
}//服务端线程操作过程
private class HandlerThread implementsRunnable{privateSocket client;privateString topic;publicHandlerThread(Socket client ,String topic) {this.client =client;this.topic =topic;
}
@Overridepublic voidrun() {try{//取得输入流
InputStream is =client.getInputStream();
BufferedReader bw= new BufferedReader(newInputStreamReader(is));while (true) {
String receive=bw.readLine();//queue.add(receive);
message=receive;
producer.send(topic,message);//这个是指定主题发送
<