第二个客户端套接字没有响应
No response from second client socket
我正在使用 Java 套接字。我有一个服务器套接字和两个客户端套接字。我的问题是,第一个客户端套接字将其消息提交到我的服务器套接字,而来自第二个客户端套接字的消息没有到达服务器套接字。这意味着,对于第一个客户端套接字,while 循环在成功消息后中断,第二个客户端以无限 while 循环结束。如果我在测试 class 中单独测试每个客户端套接字,每个客户端套接字都会将其消息正确提交到我的服务器套接字。通过观察 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();
}
}
}
该方法在线程中调用。结构如下所示:
- SocketListenerThread 从 class SocketListener[ 调用方法 listenToSocket() =39=]
- listenToSocket()如上所述
- SocketMessageThread 正在其 运行() 方法中处理客户端套接字的消息输出。
编辑
这是我的 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 套接字。我有一个服务器套接字和两个客户端套接字。我的问题是,第一个客户端套接字将其消息提交到我的服务器套接字,而来自第二个客户端套接字的消息没有到达服务器套接字。这意味着,对于第一个客户端套接字,while 循环在成功消息后中断,第二个客户端以无限 while 循环结束。如果我在测试 class 中单独测试每个客户端套接字,每个客户端套接字都会将其消息正确提交到我的服务器套接字。通过观察 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();
}
}
}
该方法在线程中调用。结构如下所示:
- SocketListenerThread 从 class SocketListener[ 调用方法 listenToSocket() =39=]
- listenToSocket()如上所述
- SocketMessageThread 正在其 运行() 方法中处理客户端套接字的消息输出。
编辑 这是我的 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;
}
大概还有更多的代码您没有向我们展示:否则,这只会记住发送的最后一行。