当前位置: 首页 > 知识库问答 >
问题:

ServerSocket在非从主线程启动时不接受所有连接

冯奇思
2023-03-14

我发现当从非主线程启动时,ServerSocket在一定程度上变得不负责任。为什么?当我在主线程中启动ServerSocket时,一切正常。

主要开始类:

public class gui
{
    public static void main(String args[])
    {
        new CpServer();
       
    }

}

启动ServerSocket并接受连接的线程类:

public class CpServer extends Thread {
    private ServerSocket server = null;
    


    public CpServer() 
    {
        
        try {
             server =new ServerSocket(3700,1,InetAddress.getByName("0.0.0.0") );
         } catch (Exception ex) {
             System.out.println( "exception on start socket"+ ex.getMessage());
         }
        
        start();
    }



    public void run() 
    {
    while(true)  
       {
            try {
                
                new NBSrvThr(server.accept()).start();
                System.out.println("Accept");

            } catch (Exception e) 
                {
                   System.out.println("Error acception connection "+e.getMessage());

                }
       }
    }

}

通讯线程:

public class NBSrvThr extends Thread {
    private Socket socket = null;
 
    public NBSrvThr(Socket socket) {
        
        this.socket = socket;
    }
     
    public void run() {
 
        try (           
            BufferedReader in = new BufferedReader( new InputStreamReader( socket.getInputStream()));
        ) {
            String inputLine;
            
            while ((inputLine = in.readLine()) != null) 
            {
                System.out.println("got packet: "+inputLine);
                break;
            }
            
            socket.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

客户端测试应用程序

启动10个连接的主启动类:

public class NBClientManyRuns {

    public static void main(String[] args)  {
 
        for (int i = 0; i < 10; i++) {
            System.out.println("Creating thread "+Integer.toString(i));
            try {
                NBThr.proceed(Integer.toString(i));
            } catch (Exception e) {
                
                System.out.println("Eception itn thr create "+Integer.toString(i));
            }
        }

    }
}

连接Thread:

public class NBThr extends Thread {
    
    public String id;

    
    public static void proceed(String ID)
    {
    NBThr t= new NBThr() ;
    t.id = ID;
    t.start();
    
    }
            
    
    public void run() 
    {
        System.out.println("Starting thread"+ " id="+ id);
        String hostName = "127.0.0.1";
        int portNumber = 3700;
 
        try (
            Socket socket = new Socket(hostName, portNumber);
            BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            ) 
        {
            BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in));
            socket.getOutputStream().write("hello".getBytes());
            System.out.println("Send done  " + hostName + " id="+ id);  
            
        } catch (Exception e) {
            System.out.println("Exception " + e.getMessage() +" "+ hostName + " id="+ id);
            
        }
        System.out.println("Leaving thread"+ " id="+ id);
    }
    
}

控制台输出:

客户端测试结果显示并非所有连接都被接受:

Creating thread 0
Creating thread 1
Creating thread 2
Creating thread 3
Starting thread id=0
Starting thread id=2
Starting thread id=1
Creating thread 4
Starting thread id=3
Creating thread 5
Starting thread id=4
Creating thread 6
Starting thread id=5
Creating thread 7
Starting thread id=6
Creating thread 8
Creating thread 9
Starting thread id=7
Starting thread id=8
Starting thread id=9
Send done  127.0.0.1 id=2
Send done  127.0.0.1 id=6
Leaving thread id=2
Leaving thread id=6
Send done  127.0.0.1 id=7
Leaving thread id=7
Send done  127.0.0.1 id=4
Leaving thread id=4
Exception Connection refused: connect 127.0.0.1 id=9
Leaving thread id=9
Exception Connection refused: connect 127.0.0.1 id=1
Leaving thread id=1
Exception Connection refused: connect 127.0.0.1 id=8
Exception Connection refused: connect 127.0.0.1 id=5
Exception Connection refused: connect 127.0.0.1 id=0
Leaving thread id=0
Leaving thread id=8
Exception Connection refused: connect 127.0.0.1 id=3
Leaving thread id=3
Leaving thread id=5

服务器控制台仅显示4个接受的连接:

Accept
Accept
Accept
Accept
got packet: hello
got packet: hello
got packet: hello
got packet: hello

共有1个答案

谯翔
2023-03-14

我认为线程有一些问题,线程会导致饥饿。我建议为此使用线程池

 类似资料:
  • 我正在创建一个简单的web代理应用程序使用Java。基本上,main方法创建一个RequestReceiver对象,该对象具有侦听web浏览器http请求的ServerSocket。从ServerSocket.Accept()返回的套接字创建一个新的连接对象,并将其放入线程池中。

  • 我在理解诸如/和/ 我试图创建九个,并让它们同时运行,以找出哪个是最有效的。 因此,当主函数启动时,我会锁定互斥锁,以确保线程不会启动,然后再告诉它们使用pthread_lock( 然后,我使用各种调度策略创建所有九个线程。完成后,我尝试使用pthread\u mutex\u unlock告诉所有线程同时启动( 但当我运行这个时,它永远不会解锁线程。主功能的“运行…”print语句将关闭,但线程从

  • 当我尝试使用start-slave.sh连接到主服务器时,spark://master:port如这里所述 我正在得到这个错误日志 我尝试使用本地ip和本地名称访问主服务器(我设法同时使用和不使用密码ssh到主服务器、用户和root用户) 谢了!

  • 我使用Java.NET套接字创建了一个服务器,我尝试通过localhost客户端访问它,它正在接受请求并响应客户端,但当我尝试通过LAN电缆连接从另一台计算机远程访问它时,它不接受任何连接,即使它正在监听本地端口(9999),然后为了查看端口是否不工作,我将Apache Web Server配置为监听端口(9999),它确实工作,所以我将它设置为监听不同的端口,但没有运气,并尝试打开防火墙上的各种

  • 我有一个作为接入点(也称为wifi热点)运行的android设备,它运行的代码是: 我将有一些其他客户端设备连接到此设备的wifi热点,并尝试连接到插座,但它将无法。 接入点的 IP 地址类似于 192.168.43.1 ...所以我将尝试从客户端设备连接到192.168.43.1:8080,它将不起作用。 但是,如果两个设备都连接到另一个wifi网络,则服务器套接字。接受();它会工作得很好!我

  • 问题内容: 我正在使用套接字运行一些测试,但遇到了一些奇怪的行为:ServerSocket将在第50个客户端套接字连接到它之后拒绝连接,即使该客户端套接字在打开下一个套接字之前就已关闭,即使延迟了在连接之间添加。 以下程序是我的实验代码,该代码在当前状态下不引发任何异常并正常终止。但是,如果将的阵列大小增加到50以上,则服务器套接字将拒绝在第50个连接后尝试连接的任何客户端套接字。 问题: 为什么