好的,所以我创建了一个相当简单的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
答案 0 :(得分:2)
当然Network.clientCommand
为空后,不再发送任何内容 - 这就是您告诉它的内容:
if((receive = receiveStream.readLine()) != null)
{
System.out.println(receive);
}
根据JavaDoc,readLine()
返回
包含行内容的字符串,不包括任何行终止字符;如果已到达流的末尾,则为null
不是" null
如果传输暂停"。如果它还没有看到一个完整的行,或者流的末尾(套接字断开),那么它还没有完成。它会一直等到输入完整的输入行,然后再转到代码的下一行。
但是你怎么知道你是否应该等待消息进来,或者发出下一封消息? 你不能。您不能依赖于何时或是否有任何东西从另一方到达。
当双方都无法发送时会发生什么?他们都开始等待接收。当一方获得新的东西时会发生什么?好吧,一旦它收到了什么,它就会发送它。但这永远不会发生!
您可以做的是在一个单独的线程中调用readLine()
。请参阅JavaDocs for Thread
和Java Tutorial Lesson "Concurrency"。如果您使用Swing作为GUI,请参阅Java教程课程"Concurrency in Swing"。