我试图通过使用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