java - While 循环不继续 - 套接字

标签 java sockets

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

我在一个类中有两个方法。一种用于服务器端(或者实际上是客户端和服务器之间的混合体),另一种用于客户端。他们连接在一起很好。当我这样做时,我注意到当我连接时,他们都互相发送垃圾邮件(现在是“客户端:已启动”和“服务器:已启动”)。我认为这是因为包含该信息的字符串是从未清空,所以他们永远不知道什么时候停止传输它。然后我确保发送消息后,该变量被清空,并在发送之前检查它是否为空。 但这就是出错的地方!这样做之后,他们根本不会发送多于一条消息。他们发送各自的欢迎消息,但之后我尝试发送的任何内容都会被忽略。这几乎就像服务器/客户端的 while 循环停止一样。

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

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

最佳答案

当然,在 Network.clientCommand 为 null 后,不会再发送任何内容 - 这就是您告诉它要做的事情:

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

根据JavaDoc , readLine() 返回

A String containing the contents of the line, not including any line-termination characters, or null if the end of the stream has been reached

如果传输中有暂停,则不是“null”。如果它还没有看到完整的行,或者流的结尾(套接字断开连接),那么它还没有完成。它会等待,直到获得完整的输入行,然后才转到代码的下一行。

但是您如何知道是否应该等待消息传入,还是发送下一条消息? 你不能。您不能依赖对方何时或是否会收到任何东西。

当双方都没有什么可发送时会发生什么?他们都开始等待接收。当一方收到新内容要发送时会发生什么?好吧,一旦它收到东西,它就会发送它。但这永远不会发生!

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

关于java - While 循环不继续 - 套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27108501/

相关文章:

java - 来自用字段值初始化的数组的 ArrayIndexOutOfBoundsException

java - 如何获取 TYPE_3BYTE_BGR 中 jpeg 图像的 rgb 值?

java - 自动化 GUI 测试

c++ - Windows Server 2012 服务中的 SOCKET 连接问题

php - iOS 选择哪种服务器端语言,以及在处理套接字连接时首选哪种服务器后端

java - 获取 Arduino UNO r3 上 XBee 数据包的有效负载值

java - java中严格使用compareTo按2个条件排序

java - 通过 NAT 将 UDP 数据包发送到 IP

c - inet_netof() 函数返回奇怪的值

c - 如何删除此 HEADER HTTP?