基本网络客户端中的意外输出

时间:2014-06-09 19:51:53

标签: java eclipse sockets loops networking

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);
        }
    }
}

所以我只是在玩Java中的网络,这是基本客户端的脚本,但出于某种原因,当我用服务器运行时,我得到了奇怪的输出:

TEST1
Server Message 1
TEST2
Server Message 2
TEST2

程序仍在运行,但输出在那里停止。令我困惑的是,TEST3并没有像我期望的那样连续输出。似乎while((fromServer = in.readLine()) != null)在两次迭代后就像它应该中断一样,但在while循环运行之后没有任何内容。由于程序仍在运行,while(clientRunning)没有中断,但它也没有迭代,因为没有输出TEST3。那么这里发生了什么?

2 个答案:

答案 0 :(得分:2)

 but it also isn't iterating because TEST3 isn't being outputted

每次调用in.readLine())时,您都在等待服务器响应到达。

根据您的结果,服务器仅将2个数据包传递给客户端,从而为您提供两个结果,并将返回读取服务器的下一个输入流,并等待响应,直到服务器关闭或添加客户端套接字中的socketTimeout。

答案 1 :(得分:1)

如果您使用while((fromServer = in.readLine()) != null),您的程序会在打印TEST2后等待输入。此外,TEST3正在循环外输出,因此仅在服务器停止发送消息时输出,即(fromServer = in.readLine()) == null时。{/ p>

你改变这个怎么样:

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");
}

然后,您可以使用此测试用例测试您的代码:

TEST1
Server Message 1
TEST2
Server Message 2
TEST2
END
TEST3

另外,我强烈建议您使用java.util.Scanner来阅读流。

希望我能提供帮助。