好的,我正在创建一个相当简单的 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/