繁体   English   中英

通过套接字进行Java TCP通信

[英]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还是PointList 以及如何从ois.readObject()检索它们?

我有点困惑,因为写入ObjectOutputStream可能快也可能慢。 Se读取ObjectInputStream(以我的方式查看)会或会导致较大的延迟(如果它每隔约15ms读取一个值,并且添加点的速度快于此)或会导致大量延迟。

有新方法时,是否只有写入ObjectOutputStreamoos )的方法?

是。 每当用户绘制内容时,都将数据向下推到ObjectInputStream

我想读过你必须要投票。

那是不对的。 通常,从打开的流中读取是一项阻塞操作 :如果您尝试读取某些内容,但那里什么也没有,那么read方法将一直阻塞,直到有新数据可用为止。

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

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

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

由三个主要组件组成(稍后会导致三个运行线程):

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

SocketRead.java:读取线程,如果有的话,它将连续尝试读取传入的消息

SocketWrite.java:写线程,它将写队列中的所有消息写到套接字

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM