2013-11-10 167 views
1

我试图通过使用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()内放置什么?单个PointListPoint s?他们如何从ois.readObject()检索?

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

回答

1

当有新数据时,是否有办法只写入ObjectOutputStreamoos)?

是。无论用户什么时候画东西,都可以将数据向下推入ObjectInputStream

我想读你必须轮询虽然。

这是不正确的。通常情况下,从开放式流读取阻止操作:如果您尝试读取某些内容并且没有任何内容,则只会阻止read方法,直到新数据可用。

+0

所以,如果我理解正确,例如,当一个新的'Point'被添加,我只需使用'oos.writeObject(new Point(20,20))'将该'Point'推到ObjectOutputStream上?如果在接收器读取它们之前多个点已写入'oos'会发生什么? – jdepypere

+0

假设你用正确方式处理多线程(如果在你的程序中的任何多线程的话),那么,你只需按动一个对象往下流。如果有多个点已被写入(串行!你必须写对象的顺序流,而不是平行的),他们将在序列一旦接收器就开始朗读起来阅读。同时,数据将在发送者和接收者之间的缓冲区中累积;这是由TCP/IP协议栈实现的,通常你不必担心它。 – Isaac

+0

不确定多线程的部分...它只是从一个'程序'到另一个,所以我不认为我需要它。不过,我只是按照发送者的意愿将'Point'推送到'ObjectOutputStream',并使用'while(true)'-part从上面读出ObjectInputStream,它似乎工作!尽管我没有使用Points,但是我创建了一个Class来传递线的起点和终点。所以现在我已经解决了,它似乎没有滞后,谢谢! – jdepypere

0
  1. 对于写入,您需要采用线程和同步技术,以便在数据可用时才写入。一个线程通知新的数据已经变得可用,另一个线程等待并被通知并且在被告知数据已经来临时继续执行;
  2. 读取不清除ObjectOutputStream。实际上,您可以使用两个线程同时处理输入和输出流。
  3. 读取一个对象是一个同步操作,这意味着你的线程等待对象准备就绪。
0

我写了一个库(你可以找到行家),将带走一些自己实现线程和同步的复杂性:

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

由三个主要部分组成(后来导致分成三个运行线程):

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

SocketRead.java:读线程,其不断尝试阅读收到的消息,如果任何

SocketWrite.java:编写线程这在写队列中写入任何消息插座

您还可以取消读取线程选项,如果你不需要它。

图书馆将确保连接保持打开状态,在任何时候,重新连接在被关闭,它一直战斗测试:)