通过Socket进行Java TCP通信

时间:2013-11-10 02:01:38

标签: java sockets tcp

我正在尝试使用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()?单PointListPoint?它们是如何从ois.readObject()

中检索出来的

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

3 个答案:

答案 0 :(得分:1)

  

当新数据存在时,是否只能写入ObjectOutputStreamoos)?

是。每当用户绘制某些内容时,请按ObjectInputStream

向下推送数据
  

我想读一下你必须要进行民意调查。

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

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

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

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

SocketRead.java:读取线程,如果有任何

,它会不断尝试读取传入的消息

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

的线程

如果您不需要,您还可以选择禁用阅读主题。

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