首页 >Java >为什么当我在测试前添加 System.out.println(in.readLine()) 语句时,我的 Java 服务器测试会通过,但如果没有该语句则会失败?

为什么当我在测试前添加 System.out.println(in.readLine()) 语句时,我的 Java 服务器测试会通过,但如果没有该语句则会失败?

王林
王林转载
2024-02-22 13:34:06763浏览

php小编鱼仔解答:在Java服务器测试中添加System.out.println(in.readLine())语句可能会影响测试结果,因为这个语句会读取服务器的输入流,使得服务器能够接收请求。如果没有该语句,服务器可能无法正确接收请求,导致测试失败。因此,在测试前添加该语句是为了确保服务器能够正常接收请求并通过测试。

问题内容

我正在努力用 java 实现一个服务器来处理多人扫雷游戏。在尝试测试我的服务器以确保它正确响应合法的客户端请求时,我发现只有在将特定客户端请求打印到服务器后添加 system.out.println(in.readline()) 语句才能通过测试输出流,但在调用测试本身之前。

例如,客户端可以发出的一个请求是“查看”请求,以查看板的当前状态。我最初为“look”编写了一个测试,如下所示:

@test(timeout = 10000)
    public void publishedtest() throws ioexception {

        thread thread = startminesweeperserver("board5");

        socket socket = connecttominesweeperserver(thread);
        
        bufferedreader in = new bufferedreader(new inputstreamreader(socket.getinputstream()));
        printwriter out = new printwriter(socket.getoutputstream(), true);

        out.println("look");
        assertequals("- - - - - - -", in.readline());
        assertequals("- - - - - - -", in.readline());
        assertequals("- - - - - - -", in.readline());
        assertequals("- - - - - - -", in.readline());
        assertequals("- - - - - - -", in.readline());
        assertequals("- - - - - - -", in.readline());
        assertequals("- - - - - - -", in.readline());

但是,当我像这样运行测试时,它失败了,并且收到一条错误消息,指出它期望 [- - - - - - -] 但得到 []。

但是,当我添加如下打印语句时:

@Test(timeout = 10000)
    public void publishedTest() throws IOException {

        Thread thread = startMinesweeperServer("board5");

        Socket socket = connectToMinesweeperServer(thread);

        BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        PrintWriter out = new PrintWriter(socket.getOutputStream(), true);

        out.println("look");
        System.out.println(in.readLine());
        assertEquals("- - - - - - -", in.readLine());
        assertEquals("- - - - - - -", in.readLine());
        assertEquals("- - - - - - -", in.readLine());
        assertEquals("- - - - - - -", in.readLine());
        assertEquals("- - - - - - -", in.readLine());
        assertEquals("- - - - - - -", in.readLine());
        assertEquals("- - - - - - -", in.readLine());

测试通过。为什么会出现这样的情况呢? print 语句是否只是给客户端更多的时间来读取服务器的输入,或者可能还有其他事情发生?如果有帮助的话,很乐意提供更多我的代码片段。

解决方法

盲目猜测:您的服务器响应以意外的空行开始。

system.out.println(in.readline());<code>println 部分实际上并不重要,只需使用 in.readline() 就会得到相同的结果,因为它“消耗”了来自服务器的第一行。这不是时间问题,因为 readline() 会阻塞,直到收到整行。

您可以在服务器上修复此问题,方法是删除发送空行的任何内容,或者修改测试以解决该问题:

out.println("look");
    assertEquals("", in.readLine()); // Add this line.
    assertEquals("- - - - - - -", in.readLine());
    assertEquals("- - - - - - -", in.readLine());
    assertEquals("- - - - - - -", in.readLine());
    assertEquals("- - - - - - -", in.readLine());
    assertEquals("- - - - - - -", in.readLine());
    assertEquals("- - - - - - -", in.readLine());
    assertEquals("- - - - - - -", in.readLine());

以上是为什么当我在测试前添加 System.out.println(in.readLine()) 语句时,我的 Java 服务器测试会通过,但如果没有该语句则会失败?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文转载于:stackoverflow.com。如有侵权,请联系admin@php.cn删除