Java 基本网络客户端中的意外输出
所以我只是在玩Java中的网络,这是一个基本客户端的脚本,但由于某种原因,当我在服务器上运行它时,我得到了奇怪的输出:Java 基本网络客户端中的意外输出,java,eclipse,sockets,loops,networking,Java,Eclipse,Sockets,Loops,Networking,所以我只是在玩Java中的网络,这是一个基本客户端的脚本,但由于某种原因,当我在服务器上运行它时,我得到了奇怪的输出: import java.io.*; import java.net.*; public class BankClient { public static void main(String[] args) throws IOException { String host = "192.168.1.100"; int port = 733
import java.io.*;
import java.net.*;
public class BankClient {
public static void main(String[] args) throws IOException {
String host = "192.168.1.100";
int port = 7331;
try(
Socket bankSocket = new Socket(host, port);
PrintWriter out = new PrintWriter(bankSocket.getOutputStream(), true);
BufferedReader in = new BufferedReader(new InputStreamReader(bankSocket.getInputStream()));
) {
BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in));
String fromServer;
boolean clientRunning = true;
while(clientRunning) {
System.out.println("TEST1");
while((fromServer = in.readLine()) != null) {
System.out.println(fromServer);
System.out.println("TEST2");
}
System.out.println("TEST3");
}
} catch (UnknownHostException e) {
System.err.println("Unknown host " + host);
System.exit(1);
} catch (IOException e) {
System.err.println("Disconnected");
System.exit(1);
}
}
}
程序仍在运行,但输出在此停止。让我困惑的是TEST3并没有像我预期的那样连续输出。似乎while((fromServer=in.readLine())!=null)
在两次迭代后会像应该的那样中断,但while循环运行后不会中断。while(clientRunning)
没有中断,因为程序仍在运行,但它也没有迭代,因为TEST3没有被输出。那么这里发生了什么
TEST1
Server Message 1
TEST2
Server Message 2
TEST2
每次调用.readLine())中的,您都在等待服务器响应的到来
根据您的结果,服务器仅向客户机传递了2个数据包,因此提供了两个结果,并将返回读取服务器的下一个输入流,并等待响应,直到服务器关闭或在客户机的套接字中添加socketTimeout
每次调用.readLine())
中的,您都在等待服务器响应的到来
根据您的结果,服务器仅向客户机传递了2个数据包,因此提供了两个结果,并将返回读取服务器的下一个输入流,并等待响应,直到服务器关闭或在客户机的套接字中添加socketTimeout
每次调用.readLine())
中的,您都在等待服务器响应的到来
根据您的结果,服务器仅向客户机传递了2个数据包,因此提供了两个结果,并将返回读取服务器的下一个输入流,并等待响应,直到服务器关闭或在客户机的套接字中添加socketTimeout
每次调用.readLine())
中的,您都在等待服务器响应的到来
根据您的结果,服务器仅向客户机传递了2个数据包,因此提供了两个结果,并将返回读取服务器的下一个输入流,并等待响应,直到服务器关闭或在客户机的套接字中添加socketTimeout 如果您使用while((fromServer=in.readLine())!=null)
您的程序将在打印TEST2
后等待输入。另外,TEST3
在循环外部输出,因此它仅在服务器停止发送消息时才会输出,即(fromServer=in.readLine())==null
您如何更改此选项:
but it also isn't iterating because TEST3 isn't being outputted
对这样的事情:
while((fromServer = in.readLine()) != null) {
System.out.println(fromServer);
System.out.println("TEST2");
}
然后,您可以使用以下测试用例测试代码:
while((fromServer = in.readLine()) != "EXIT") {
System.out.println(fromServer);
System.out.println("TEST2");
}
另外,我强烈建议您使用java.util.Scanner
来读取流
希望我能提供帮助。如果您使用while((fromServer=in.readLine())!=null)
您的程序将在打印TEST2
后等待输入。另外,TEST3
在循环外部输出,因此它仅在服务器停止发送消息时才会输出,即(fromServer=in.readLine())==null
您如何更改此选项:
but it also isn't iterating because TEST3 isn't being outputted
对这样的事情:
while((fromServer = in.readLine()) != null) {
System.out.println(fromServer);
System.out.println("TEST2");
}
然后,您可以使用以下测试用例测试代码:
while((fromServer = in.readLine()) != "EXIT") {
System.out.println(fromServer);
System.out.println("TEST2");
}
另外,我强烈建议您使用java.util.Scanner
来读取流
希望我能提供帮助。如果您使用while((fromServer=in.readLine())!=null)
您的程序将在打印TEST2
后等待输入。另外,TEST3
在循环外部输出,因此它仅在服务器停止发送消息时才会输出,即(fromServer=in.readLine())==null
您如何更改此选项:
but it also isn't iterating because TEST3 isn't being outputted
对这样的事情:
while((fromServer = in.readLine()) != null) {
System.out.println(fromServer);
System.out.println("TEST2");
}
然后,您可以使用以下测试用例测试代码:
while((fromServer = in.readLine()) != "EXIT") {
System.out.println(fromServer);
System.out.println("TEST2");
}
另外,我强烈建议您使用java.util.Scanner
来读取流
希望我能提供帮助。如果您使用while((fromServer=in.readLine())!=null)
您的程序将在打印TEST2
后等待输入。另外,TEST3
在循环外部输出,因此它仅在服务器停止发送消息时才会输出,即(fromServer=in.readLine())==null
您如何更改此选项:
but it also isn't iterating because TEST3 isn't being outputted
对这样的事情:
while((fromServer = in.readLine()) != null) {
System.out.println(fromServer);
System.out.println("TEST2");
}
然后,您可以使用以下测试用例测试代码:
while((fromServer = in.readLine()) != "EXIT") {
System.out.println(fromServer);
System.out.println("TEST2");
}
另外,我强烈建议您使用java.util.Scanner
来读取流
希望我能帮上忙。传递一个字符串(令牌),例如STOP,以标识服务器已发送所有数据并退出while循环。客户端和服务器之间应该有一个通信协议来进行通信<.readLine()中的code>in
是一个阻塞语句,它等待服务器的下一行。可能服务器没有关闭连接-因此客户端不知道不会有更多数据。您正在等待服务器发送另一条消息,该消息阻塞了主Threadi现在明白了,如果你们中有人能把它放在一个答案中,我会接受的。说真的,使用java.utils.Scanner
而不是所有这些缓冲区。传递一个字符串(令牌),比如STOP,以标识服务器已经发送了所有数据,并且从while循环中出来。客户端和服务器之间应该有一个通信协议来进行通信<.readLine()中的code>in是一个阻塞语句,它等待服务器的下一行。可能服务器没有关闭连接-因此客户端不知道不会有更多数据。您正在等待服务器发送另一条消息,该消息阻塞了主Threadi现在明白了,如果你们中有人能把它放在一个答案中,我会接受的。说真的,使用java.utils.Scanner
而不是所有这些缓冲区。传递一个字符串(令牌),比如STOP,以标识服务器已经发送了所有数据,并且从while循环中出来。应该有