serverSocket.accpet()失效 求原因以及解决方法

创建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();
    }


}

这个是完整的代码