目录
问题内容
解决方法
首页 Java 为什么当我在测试前添加 System.out.println(in.readLine()) 语句时,我的 Java 服务器测试会通过,但如果没有该语句则会失败?

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

Feb 22, 2024 pm 01:34 PM

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中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌
威尔R.E.P.O.有交叉游戏吗?
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)