[英]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.