2013-11-10 171 views
1

我試圖通過使用TCP的套接字進行通信。需要發送的數據是一張圖紙,正在繪製。所以選項是發送所有的點,或只有形狀(一系列的點)。通過套接字的Java TCP通信

因爲它會被立即繪製出來,所以發送點似乎更好。只適用於本地使用,所以很多數據不應該成爲問題。現在我遇到的問題是瞭解套接字的工作原理。目前我的代碼如下:

while(true){ 

     try { 
      Thread.sleep(10); 
     } 
     catch (InterruptedException e) {} 

     switch(connectionStatus){ 
     case CONNECTED: 
      if(isHost){ 
       try { 
        oos.writeObject(myObject); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      }else{ 
       try { 
        myObject = (myObjectType) ois.readObject(); 
        mainFrame.repaint(); 
       } catch (ClassNotFoundException e) { 
        e.printStackTrace(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 
      break; 
     } 
} 

但不用說,這似乎相當無效,因爲它不斷運行。當有新數據時,是否有辦法只寫入ObjectOutputStream(oos)?我想讀你不得不輪詢。閱讀是否也清除ObjectOutputStream?

編輯

要明確:我想通過套接字發送多個Point -objects。所以每當Point被添加到例如服務器時,它應該將這一點發送給客戶端。

現在,我需要在oos.writeObject()內放置什麼?單個PointListPoint s?他們如何從ois.readObject()檢索?

我有點困惑,因爲寫入ObjectOutputStream的速度可能很快或很慢。如果讀取ObjectInputStream - 我看到它的方式 - 會導致很大的延遲(如果它每15ms讀取一個值,並且點的增加速度比這更快)或導致大量延遲。

回答

1

當有新數據時,是否有辦法只寫入ObjectOutputStreamoos)?

是。無論用戶什麼時候畫東西,都可以將數據向下推入ObjectInputStream

我想讀你必須輪詢雖然。

這是不正確的。通常情況下,從開放式流讀取阻止操作:如果您嘗試讀取某些內容並且沒有任何內容,則只會阻止read方法,直到新數據可用。

+0

所以,如果我理解正確,例如,當一個新的'Point'被添加,我只需使用'oos.writeObject(new Point(20,20))'將該'Point'推到ObjectOutputStream上?如果在接收器讀取它們之前多個點已寫入'oos'會發生什麼? – jdepypere

+0

假設你用正確方式處理多線程(如果在你的程序中的任何多線程的話),那麼,你只需按動一個對象往下流。如果有多個點已被寫入(串行!你必須寫對象的順序流,而不是平行的),他們將在序列一旦接收器就開始朗讀起來閱讀。同時,數據將在發送者和接收者之間的緩衝區中累積;這是由TCP/IP協議棧實現的,通常你不必擔心它。 – Isaac

+0

不確定多線程的部分...它只是從一個'程序'到另一個,所以我不認爲我需要它。不過,我只是按照發送者的意願將'Point'推送到'ObjectOutputStream',並使用'while(true)'-part從上面讀出ObjectInputStream,它似乎工作!儘管我沒有使用Points,但是我創建了一個Class來傳遞線的起點和終點。所以現在我已經解決了,它似乎沒有滯後,謝謝! – jdepypere

0
  1. 對於寫入,您需要採用線程和同步技術,以便在數據可用時才寫入。一個線程通知新的數據已經變得可用,另一個線程等待並被通知並且在被告知數據已經來臨時繼續執行;
  2. 讀取不清除ObjectOutputStream。實際上,您可以使用兩個線程同時處理輸入和輸出流。
  3. 讀取一個對象是一個同步操作,這意味着你的線程等待對象準備就緒。
0

我寫了一個庫(你可以找到行家),將帶走一些自己實現線程和同步的複雜性:

https://github.com/xtrinch/socket-live

由三個主要部分組成(後來導致分成三個運行線程):

SocketConnection.java:主線程,由庫的用戶運行,它確保連接總是打開的

SocketRead.java:讀線程,其不斷嘗試閱讀收到的消息,如果任何

SocketWrite.java:編寫線程這在寫隊列中寫入任何消息插座

您還可以取消讀取線程選項,如果你不需要它。

圖書館將確保連接保持打開狀態,在任何時候,重新連接在被關閉,它一直戰鬥測試:)