[英]While loop not continuing - socket
好的,所以我正在創建一個相當簡單的Java應用程序,該應用程序最終將變成在線2人德州撲克游戲。 現在,我正在嘗試通過網絡發送一些簡單的消息,以確保基本功能正常運行。 但是我被困住了。
我上課有兩種方法。 一個用於服務器端(或實際上是客戶端和服務器之間的混合體),另一個用於客戶端。 他們很好地連接在一起。 在進行此操作時,我注意到在連接時,它們都向其默認郵件發送了垃圾郵件(現在彼此之間是“客戶端:已啟動”和“服務器:已啟動”)。我認為這是因為包含該信息的字符串是從來沒有清空過,所以他們不知道什么時候停止發送它,然后我確保在發送消息后,該變量為空,並在發送之前檢查了它是否為空,但這是哪里出錯了!之后,他們根本不會發送多條消息,而是發送各自的歡迎消息,但是在此之后我嘗試傳輸的任何內容都將被忽略,這就像服務器/客戶端的while循環停止一樣。
因此,我在類中聲明了兩個公共變量。 這些包含服務器或客戶端希望發送的任何消息。
public static String serverCommand = null;
public static String clientCommand = 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()
返回
一個字符串,其中包含行的內容,不包含任何行終止符;如果已到達流的末尾,則為null
不是“如果傳輸暫停,則為null
”。 如果還沒有看到完整的行或流的末尾(套接字斷開連接),那么還沒有完成。 它會等到獲得完整的輸入行,然后再轉到代碼的下一行。
但是,您如何知道是應該等待消息進入還是發送下一條消息呢? 你不能 。 您不能依靠何時或是否有任何東西將從另一側到達。
雙方無話可發送時會發生什么? 他們倆都開始等待接收。 當一方收到要發送的新消息時會發生什么? 好吧,一旦收到東西,它就會發送它。 但這永遠不會發生!
您可以在單獨的線程中調用readLine()
。 請參閱JavaDocs for Thread
和Java教程課程“並發” 。 而且,如果您將Swing用於GUI,還請參見Java教程“ Swing的並發性” 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.