我試圖通過使用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()
內放置什麼?單個Point
或List
的Point
s?他們如何從ois.readObject()
檢索?
我有點困惑,因爲寫入ObjectOutputStream的速度可能很快或很慢。如果讀取ObjectInputStream - 我看到它的方式 - 會導致很大的延遲(如果它每15ms讀取一個值,並且點的增加速度比這更快)或導致大量延遲。
所以,如果我理解正確,例如,當一個新的'Point'被添加,我只需使用'oos.writeObject(new Point(20,20))'將該'Point'推到ObjectOutputStream上?如果在接收器讀取它們之前多個點已寫入'oos'會發生什麼? – jdepypere
假設你用正確方式處理多線程(如果在你的程序中的任何多線程的話),那麼,你只需按動一個對象往下流。如果有多個點已被寫入(串行!你必須寫對象的順序流,而不是平行的),他們將在序列一旦接收器就開始朗讀起來閱讀。同時,數據將在發送者和接收者之間的緩衝區中累積;這是由TCP/IP協議棧實現的,通常你不必擔心它。 – Isaac
不確定多線程的部分...它只是從一個'程序'到另一個,所以我不認爲我需要它。不過,我只是按照發送者的意願將'Point'推送到'ObjectOutputStream',並使用'while(true)'-part從上面讀出ObjectInputStream,它似乎工作!儘管我沒有使用Points,但是我創建了一個Class來傳遞線的起點和終點。所以現在我已經解決了,它似乎沒有滯後,謝謝! – jdepypere