簡體   English   中英

通過套接字進行Java TCP通信

[英]Java TCP communication through Socket

我正在嘗試使用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對象。 因此,每次將Point添加到例如服務器時,它都應將此點發送給客戶端。

現在,我需要將什么放入oos.writeObject() 單個Point還是PointList 以及如何從ois.readObject()檢索它們?

我有點困惑,因為寫入ObjectOutputStream可能快也可能慢。 Se讀取ObjectInputStream(以我的方式查看)會或會導致較大的延遲(如果它每隔約15ms讀取一個值,並且添加點的速度快於此)或會導致大量延遲。

有新方法時,是否只有寫入ObjectOutputStreamoos )的方法?

是。 每當用戶繪制內容時,都將數據向下推到ObjectInputStream

我想讀過你必須要投票。

那是不對的。 通常,從打開的流中讀取是一項阻塞操作 :如果您嘗試讀取某些內容,但那里什么也沒有,那么read方法將一直阻塞,直到有新數據可用為止。

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

我寫了一個庫(可以在Maven上找到),它可以消除一些自己實現線程和同步的復雜性:

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

由三個主要組件組成(稍后會導致三個運行線程):

SocketConnection.java:主線程,由庫的用戶運行,以確保連接始終處於打開狀態

SocketRead.java:讀取線程,如果有的話,它將連續嘗試讀取傳入的消息

SocketWrite.java:寫線程,它將寫隊列中的所有消息寫到套接字

如果不需要,您還可以選擇禁用讀取線程。

庫將確保連接始終保持打開狀態,關閉后重新連接,並且已經過戰斗測試:)

暫無
暫無

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

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