我正在尝试使用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
或List
个Point
?它们是如何从ois.readObject()
我有点困惑,因为写入ObjectOutputStream的速度可能很快或很慢。 Se读取ObjectInputStream - 我看到它的方式 - 会导致或导致很大的延迟(如果它每隔15ms读取一个值并且点数比这更快)或者导致很多延迟。
答案 0 :(得分:1)
当新数据存在时,是否只能写入
ObjectOutputStream
(oos
)?
是。每当用户绘制某些内容时,请按ObjectInputStream
。
我想读一下你必须要进行民意调查。
这是不正确的。通常,从开放流中读取是阻止操作:如果您尝试读取某些内容并且没有任何内容,则read
方法将直接阻止,直到有新数据可用。
答案 1 :(得分:0)
答案 2 :(得分:0)
我写了一个库(你可以在maven上找到),这将带走一些自己实现线程和同步的复杂性:
https://github.com/xtrinch/socket-live
由三个主要组件组成(后来导致三个正在运行的线程):
SocketConnection.java:主要线程,由库的用户运行,确保连接始终打开
SocketRead.java:读取线程,如果有任何
,它会不断尝试读取传入的消息SocketWrite.java:写入将写入队列中的任何消息写入套接字
的线程如果您不需要,您还可以选择禁用阅读主题。
图书馆将确保连接始终保持打开状态,在关闭时重新连接,并且已经过战斗测试:)