簡體   English   中英

雖然循環不繼續-套接字

[英]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);
}

根據JavaDocreadLine()返回

一個字符串,其中包含行的內容,不包含任何行終止符;如果已到達流的末尾,則為null

不是“如果傳輸暫停,則為null ”。 如果還沒有看到完整的行或流的末尾(套接字斷開連接),那么還沒有完成。 它會等到獲得完整的輸入行,然后再轉到代碼的下一行。

但是,您如何知道是應該等待消息進入還是發送下一條消息呢? 你不能 您不能依靠何時或是否有任何東西將從另一側到達。

雙方無話可發送時會發生什么? 他們倆都開始等待接收。 當一方收到要發送的新消息時會發生什么? 好吧,一旦收到東西,它就會發送它。 但這永遠不會發生!

您可以在單獨的線程中調用readLine() 請參閱JavaDocs for Thread和Java教程課程“並發” 而且,如果您將Swing用於GUI,還請參見Java教程“ Swing的並發性”

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM