首页 > Java > 正文

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

王林
发布: 2024-02-22 13:34:06
转载
738 人浏览过

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
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!