虽然循环没有继续 - 套接字

时间:2014-11-24 15:38:44

标签: java sockets

好的,所以我创建了一个相当简单的Java应用程序,最终将变成一个在线2人游戏德州扑克游戏。现在,我试图通过网络发送一些简单的消息,以确保基本功能正常工作。然而,我被卡住了。

我在课堂上有两种方法。一个用于服务器端(或者实际上是客户端和服务器之间的混合),另一个用于客户端。他们连在一起很好。当我这样做时,我注意到当我连接时,他们都发送了他们的默认消息(现在是"客户端:已启动"以及"服务器:已启动"来回彼此。我认为这是因为包含该信息的字符串从未被清空,因此他们永远不知道何时停止传输它。然后我确保在发送消息后,该变量被清空,并检查它是否为空在发送之前。 这里出了问题!在这之后,他们根本不会发送多条消息。他们发送各自的欢迎信息,但我之后尝试传输的任何信息都会被忽略。它几乎就像服务器/客户端的while循环停止一样。

所以,我在类中声明了两个公共变量。这些包含服务器或客户端希望发送的任何消息。

public static String serverCommand = null;

public static String clientCommand = null;

默认情况下它们为null,但在GUI部分的运行时期间已更改。 服务器循环如下所示:

                while(true)
                {
                    if((receive = receiveStream.readLine()) != null)
                    {
                        System.out.println(receive);
                    }
                    if(serverCommand != null)
                    {
                        printer.println(serverCommand);
                        printer.flush();
                        Network.serverCommand = null;
                    }
                }

客户端while循环如下:

                while(true)
                {
                    if(Network.clientCommand != null)
                    {
                        printer.println(clientCommand);
                        printer.flush();
                        Network.clientCommand = null;
                    }

                    if((receive = receiveStream.readLine()) != null)
                    {
                        System.out.println(receive);
                    }
                }

然而,正如所提到的 - 在第一次将Network.clientCommand设置为null之后,它永远不会再发送任何消息,即使Network.clientCommand在运行时由于用户输入而发生更改。

我会发布两个链接到客户端/服务器的完整源代码 - 下面是这个部分,因为它们有点太大而无法粘贴在这里。

链接: http://hastebin.com/oqotirufic.java

这里有没有人知道发生了什么,以及在尝试修复/解决它时应该怎么想?我补充一点,我对Java和网络编程的经验非常有限。

修改

我将添加GUI的一部分,用于访问/更改变量。 http://hastebin.com/upadayuwug.java

1 个答案:

答案 0 :(得分:2)

当然Network.clientCommand为空后,不再发送任何内容 - 这就是您告诉它的内容:

if((receive = receiveStream.readLine()) != null)
{
    System.out.println(receive);
}

根据JavaDocreadLine()返回

  

包含行内容的字符串,不包括任何行终止字符;如果已到达流的末尾,则为null

不是" null如果传输暂停"。如果它还没有看到一个完整的行,或者流的末尾(套接字断开),那么它还没有完成。它会一直等到输入完整的输入行,然后再转到代码的下一行。

但是你怎么知道你是否应该等待消息进来,或者发出下一封消息? 你不能。您不能依赖于何时或是否有任何东西从另一方到达。

当双方都无法发送时会发生什么?他们都开始等待接收。当一方获得新的东西时会发生什么?好吧,一旦它收到了什么,它就会发送它。但这永远不会发生!

您可以做的是在一个单独的线程中调用readLine()。请参阅JavaDocs for Thread和Java Tutorial Lesson "Concurrency"。如果您使用Swing作为GUI,请参阅Java教程课程"Concurrency in Swing"