[英]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
還是Point
的List
? 以及如何從ois.readObject()
檢索它們?
我有點困惑,因為寫入ObjectOutputStream可能快也可能慢。 Se讀取ObjectInputStream(以我的方式查看)會或會導致較大的延遲(如果它每隔約15ms讀取一個值,並且添加點的速度快於此)或會導致大量延遲。
有新方法時,是否只有寫入
ObjectOutputStream
(oos
)的方法?
是。 每當用戶繪制內容時,都將數據向下推到ObjectInputStream
。
我想讀過你必須要投票。
那是不對的。 通常,從打開的流中讀取是一項阻塞操作 :如果您嘗試讀取某些內容,但那里什么也沒有,那么read
方法將一直阻塞,直到有新數據可用為止。
我寫了一個庫(可以在Maven上找到),它可以消除一些自己實現線程和同步的復雜性:
https://github.com/xtrinch/socket-live
由三個主要組件組成(稍后會導致三個運行線程):
SocketConnection.java:主線程,由庫的用戶運行,以確保連接始終處於打開狀態
SocketRead.java:讀取線程,如果有的話,它將連續嘗試讀取傳入的消息
SocketWrite.java:寫線程,它將寫隊列中的所有消息寫到套接字
如果不需要,您還可以選擇禁用讀取線程。
庫將確保連接始終保持打開狀態,關閉后重新連接,並且已經過戰斗測試:)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.