1

我正在尝试使用 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。因此,每次将 aPoint添加到例如服务器时,它都应该将此点发送给客户端。

现在,我需要在里面放oos.writeObject()什么?单一的Point,还是sList的一个Point?它们是如何从ois.readObject()?

我有点困惑,因为写入 ObjectOutputStream 可能快也可能慢。Se读取ObjectInputStream - 我看到它的方式 - 会或导致很大的延迟(如果它每~15ms读取一个值并且点的添加速度比这更快)或导致很多延迟。

4

3 回答 3

1

有没有办法只在有新数据时写入ObjectOutputStream( ) ?oos

是的。每当用户绘制某些东西时,将数据向下推送到ObjectInputStream.

我想要阅读,您必须进行民意调查。

这是不正确的。通常,从打开的流中读取是一个阻塞操作:如果您尝试读取某些内容并且那里没有任何内容,则该read方法将简单地阻塞,直到有新数据可用。

于 2013-11-10T02:30:19.077 回答
0
  1. 对于写入,您需要使用线程和同步技术,以便仅在数据可用时写入。一个线程通知新数据可用,另一个线程等待并被通知并在被告知数据已到达时继续执行;
  2. 读取不会清除 ObjectOutputStream。实际上,您可以使用两个线程同时处理输入和输出流。
  3. 读取一个对象是一个同步操作,这意味着你的线程会一直等到对象准备好。
于 2013-11-10T02:34:40.977 回答
0

我写了一个库(你可以在 maven 上找到),它可以消除你自己实现线程和同步的一些复杂性:

https://github.com/xtrinch/socket-live

由三个主要组件组成(后来导致三个正在运行的线程):

SocketConnection.java:主线程,由库的用户运行,确保连接始终打开

SocketRead.java:读取线程不断尝试读取传入消息(如果有)

SocketWrite.java:将写入队列中的任何消息写入套接字的写入线程

如果不需要,您还可以选择禁用读取线程。

图书馆将确保连接始终保持打开状态,在关闭时重新连接,并且已经过实战测试:)

于 2017-11-20T22:32:59.403 回答