java - 第二个客户端套接字没有响应

标签 java multithreading sockets response runnable

我正在使用 Java 套接字。我有一个服务器套接字和两个客户端套接字。我的问题是,第一个客户端套接字将其消息提交到我的服务器套接字,而来自第二个客户端套接字的消息未到达服务器套接字。这意味着,对于第一个客户端套接字,while 循环在成功的消息后被中断,而第二个客户端则以无限 while 循环结束。如果我在测试类中单独测试每个客户端套接字,则每个客户端套接字都会将其消息正确提交到我的服务器套接字。通过观察 TCPView,我注意到,只要使用我的端口,客户端套接字就不会响应。

我读到,即使使用了该端口,第二个客户端套接字仍应响应其消息。就我而言,第二个客户端套接字应始终在第一个客户端套接字之后大约一秒做出响应。但我无法让它们一个接一个地工作。

所以,这是我的方法代码,它正在等待客户端消息:

public void listenToSocket()
{
    serverSocket = null;
    thread = null;
    SocketAddress adress = new InetSocketAddress(CommunicationValues.SOCKET_PORT);
    try {
        serverSocket = new ServerSocket();
        serverSocket.setReuseAddress(true);
        serverSocket.bind(adress);

    } catch (IOException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
        System.exit(0);
    }




    while(true){
        try
        {
            Socket clientSocket = serverSocket.accept();
            thread = new SocketMessageThread(clientSocket);
            thread.start();         

        } catch (IOException e) {
            System.out.println("MyServerSocket caught an error: \n" + e.getMessage());
            e.printStackTrace();
        }
    }

}

该方法在线程中调用。结构如下所示:

  • SocketListenerThreadSocketListener 类调用方法 listenToSocket()
  • listenToSocket() 如上所述
  • SocketMessageThread 正在其 run() 方法中处理客户端套接字的消息输出。

编辑 这是我的SocketMessageThread的代码:

public class SocketMessageThread extends Thread{

private Socket clientSocket;
private static int nameCounter = 0;


public SocketMessageThread(Socket clientSocket) {
    this.clientSocket = clientSocket;
    this.setDaemon(true);
    this.setName("SocketMessageThread" + (nameCounter++));
}

public void run() {
    try (
            BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));)
    {
        while (in.ready())
        {
            String inLine = in.readLine();
            CommunicationValues.MESSAGE_MEMORIZER = inLine;
        }
        clientSocket.close();

    } catch (IOException e) {
        e.printStackTrace();
    }   
}}

编辑2 两个客户端仅与一条特定消息进行通信。例如。当客户端启动时,它会提到启动成功并显示一条消息。在服务器套接字捕获它们之前,不会有来自客户端套接字的重复消息。因此,如果服务器套接字没有捕获该消息,该消息就会消失,并且客户端套接字不会再次发送该消息。

最佳答案

while (in.ready())
{
    // ...
}

典型地滥用了ready()。将这一切换成:

String inLine;
while ((inLine = in.readLine()) != null)
{
    CommunicationValues.MESSAGE_MEMORIZER = inLine;
}

大概还有更多代码您没有向我们展示:否则这一切只会记住发送的最后一行。

关于java - 第二个客户端套接字没有响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30476530/

相关文章:

java - Z-Linux 上的 BlazeDS 支持

java - 如何在 Android 上使用 Google 的汉字文字转语音服务?

sockets - 在非阻塞套接字上检查WSACONREFUSED

C++ Socket recv 接收不到正确的字节数?

Java:While 循环中嵌入 Equals 语句

用于测试私有(private)方法的 Java 工具?

multithreading - System Verilog fork join - 实际上不是并行的?

java - 如果它们死了,我该如何重生线程

Java 线程执行后被多次中断

Java套接字将发送但没有收到响应