创建serverSocket(9999),并进行持续监听
ServerSocket serverSocket = new ServerScoket(9999);
int count = 0;
while (true){
//调用accept()方法,开始监听,等待客户端连接
Socket socket = serverSocket.accept();
count++;
if (count!=0){
System.out.println("连接的数量:"+count);
}
}
多个客户端并发连接,部分客户端显示已经连接socket,但是accpect()并未监听到连接的客户端,客户端发送的消息同样接收不到,部分客户端正常。
这是完整代码么?请求来了不做任何处理吗?
accept和处理线程是怎么分配的呢,别阻塞住accept线程了。
nio多线程问题还是比较复杂的,建议使用netty框架,这些io处理都交给框架做,自己写业务逻辑就行了
package com.huantek.vein.socket;
import ch.qos.logback.core.net.server.Client;
import ch.qos.logback.core.net.server.ServerSocketListener;
import com.corundumstudio.socketio.Configuration;
import com.corundumstudio.socketio.SocketIOServer;
import com.huantek.jni.conversionData.conversionData;
import com.huantek.vein.Model.FirmSuit;
import com.huantek.vein.util.*;
import lombok.SneakyThrows;
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.stereotype.Component;
import javax.net.ServerSocketFactory;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.HashMap;
@Component("SocketServer")
public class SocketServer implements ApplicationListener<ContextRefreshedEvent> {
private static ServerSocket serverSocket;
@SneakyThrows
@Override
public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) {
// TODO Auto-generated method stub
socketSeverStart();
}
public static void socketSeverStart() throws UnknownHostException {
HashMap<String, Socket> socketMap = publicVariable.socketMap;//获取公共的socket集合
InetAddress local;
long one = System.currentTimeMillis();
int [] socketPortArray = {9999,9977,7777,4444,9944,7744};
int [] websocketPortArray = {30000,30001,30002,30003,30004,30005};
int socketPort = 0 , websocketPort = 0;
for (int port : socketPortArray) {
boolean flag = testPort.isLocalePortUsing(port);
if (flag == false){
socketPort = port;
break;
}
}
for (int port : websocketPortArray) {
boolean flag = testPort.isLocalePortUsing(port);
if (flag == false){
websocketPort = port;
break;
}
}
local = InetAddress.getLocalHost();//获取本机信息
String IP = local.getHostAddress();//获取本机IP
Configuration config = new Configuration();//new 一个配置项
config.setHostname("127.0.0.1");//设置本机IP
config.setPort(websocketPort);//设置监听端口
config.setMaxFramePayloadLength(1024 * 1024);
config.setMaxHttpContentLength(1024 * 1024);
SocketIOServer server = new SocketIOServer(config);//new websocketIO服务
server.start();//启动websocketIO
System.out.println("WebSocket启动,等待PC连接...");
try {
serverSocket = new ServerSocket(socketPort);
}catch (Exception e){
System.out.println("serverSocket异常!");
e.printStackTrace();
}
System.out.println("服务端启动成功,websocket端口:"+websocketPort+" socket端口:"+socketPort);
System.out.println(serverSocket.hashCode());
WebSocketServer webSocketServer2 = new WebSocketServer(server,socketMap,serverSocket);
webSocketServer2.socketStart();
signInJmDNS signInJmDNS = new signInJmDNS();
signInJmDNS.signInServer(IP,socketPort);//注册VeinMoCap服务让固件可以找到
searchJmDNS searchJmDNS = new searchJmDNS();
searchJmDNS.start();
System.out.println("VeinMoCap服务注册完成,等待固件搜索连接...");
ArrayList<FirmSuit> FirmSuits = integratedData.initFirmSuitList();//初始化设备列表数组
sendDeviceList sendDeviceList = new sendDeviceList(server);//初始化发送设备列表方法
sendDeviceList.start();//开始发送设备列表
conversionData conversionData = new conversionData(server);//动作数据转换
conversionData.start();
new Thread(()->{
int count = 0,numBer = 0;//count记录客户端连接个数,count记录固件连接个数;
try {
while (true){
Socket socket = serverSocket.accept();//调用accept()方法,开始监听,等待客户端连接
socket.setTcpNoDelay(true);
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String channelToken = bufferedReader.readLine();
if(channelToken!=null){
if ("U3D".equals(channelToken)){//识别算法socket
System.out.println("U3D连接----");
socketMap.put(channelToken,socket);//读入字节流,存入相应的socket在Map中
SendVeinData sendVeinData = new SendVeinData(socketMap);//创建socket发送线程
sendVeinData.start();//发送Vein数据线程启动
}
if ("Firmware".equals(channelToken)){//识别传感器socket
numBer++;
count++;
channelToken+=numBer;
socketMap.put(channelToken,socket);//读入字节流,存入相应的socket在Map中
SocketThreadFirm socketThread = new SocketThreadFirm(server,socketMap,numBer,count,FirmSuits);//创建Socket线程
sendFirmMsgThread sendFirmMsgThread = new sendFirmMsgThread(socketMap, numBer);//创建socket发送线程
socketThread.start();//启动线程
sendFirmMsgThread.start();//启动定时发送线程
}
if (count!=0){
System.out.println("固件连接的数量:"+count);
}
if (count>=1){
recordFrameRate recordFrameRate = new recordFrameRate();
recordFrameRate.start();
}
InetAddress inetAddress = socket.getInetAddress();
String hostAddress = inetAddress.getHostAddress();//获取连接客户端的IP
System.out.println("Socket客户端:---"+hostAddress);
}
}
} catch (Exception e) {
System.out.println("socketServer");
e.printStackTrace();
}
//需要死循环持续监听客户端传来的消息
//serverSocket.close();
}).start();
}
}
这个是完整的代码