Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
奇怪的Java套接字行为(连接,但不发送)_Java_Sockets_Objectoutputstream - Fatal编程技术网

奇怪的Java套接字行为(连接,但不发送)

奇怪的Java套接字行为(连接,但不发送),java,sockets,objectoutputstream,Java,Sockets,Objectoutputstream,我有一个相当复杂的项目,可以归结为一个通过对象流进行通信的简单客户机/服务器 在两个连续的连接中(我连接一次,工作,断开连接,然后再次连接,工作,断开连接),一切都能完美地工作。客户端连接、执行其业务,然后关闭。服务器成功关闭对象输出流和套接字,没有IO错误 当我第三次尝试连接时,连接似乎通过了(ServerSocket.accept()方法通过了,并且成功创建了ObjectOutputStream)。但是,没有传递任何数据。readUnshared()方法只是阻塞 我已采取以下记忆预防措施:

我有一个相当复杂的项目,可以归结为一个通过对象流进行通信的简单客户机/服务器

在两个连续的连接中(我连接一次,工作,断开连接,然后再次连接,工作,断开连接),一切都能完美地工作。客户端连接、执行其业务,然后关闭。服务器成功关闭对象输出流和套接字,没有IO错误

当我第三次尝试连接时,连接似乎通过了(ServerSocket.accept()方法通过了,并且成功创建了ObjectOutputStream)。但是,没有传递任何数据。readUnshared()方法只是阻塞

我已采取以下记忆预防措施:

  • 当需要关闭套接字时,所有正在运行的线程都将停止,所有对象都将为空
  • 每次writeUnshared()方法之后 调用时,ObjectOutputBuffer为 刷新并重置
  • 有没有人遇到过类似的问题,或者有没有人有什么建议?恐怕我的项目相当大,所以复制代码是有问题的

    该项目归结为:

    主服务器

    ServerSocket serverSocket = new ServerSocket(port);
    
    while (true) {
        new WorkThread(serverSocket.accept()).start();
    }
    
    工作线程(服务器)

    客户端

    public Client() {
        Object myObject;
        Socket mySocket = new Socket(address, port);
    
        try {
             ObjectOutputBuffer output = new ObjectOutputBuffer(new BufferedOutputStream(mySocket.getOutputStream()));
    
             output.reset();
             output.flush();
        } catch (Exception e) {
             System.out.println("Could not get an input.");
             mySocket.close();
             return;
        }
    
        // get object data is not specified in this sample. it simply returns a serializable object
        myObject = getObjectData();
    
        while (myObject != null) {
             try {
                  output.writeUnshared(myObject);
                  output.reset();
                  output.flush();
             } catch (Exception e) {
                  e.printStackTrace();
                  break;
             } // catch
        } // while
    
        try {
             output.close();
             socket.close();
        } catch (Exception e) { 
             System.out.println("Could not close.");
        }
    }
    
    感谢所有能够提供帮助的人

    (1)什么是ObjectInputBuffer和ObjectOutputBuffer?您是指ObjectInputStream和ObjectOutputStream吗

    (2) 如果是这样,在创建ObjectOutputStream后立即调用reset()只会浪费时间和带宽

    (3) 为什么在创建输出流的异常上打印“无法获取输入”

    (4) 当你遇到异常时,你应该总是打印它的消息——不要完全用你自己的消息来代替它,那只是丢掉有用的信息

    (5) 您假设读取时的任何IOException都意味着流的结束。只有EOFEException意味着这一点。应打印或记录任何其他IOException。很明显,您在这里遇到了一些其他异常,并且忽略了它


    (6) 为什么一直发送相同的对象?

    来自ObjectInputStream API for readUnshared():

    从中读取“非共享”对象 ObjectInputStream。这种方法是可行的 与readObject相同,只是 它可以防止后续调用 readObject和readUnshared自 返回对 通过获取反序列化实例 这个电话


    这可能是问题所在吗?改用readObject()。

    使用readUnshared和readObject有什么原因吗?我觉得这很危险。
    public Client() {
        Object myObject;
        Socket mySocket = new Socket(address, port);
    
        try {
             ObjectOutputBuffer output = new ObjectOutputBuffer(new BufferedOutputStream(mySocket.getOutputStream()));
    
             output.reset();
             output.flush();
        } catch (Exception e) {
             System.out.println("Could not get an input.");
             mySocket.close();
             return;
        }
    
        // get object data is not specified in this sample. it simply returns a serializable object
        myObject = getObjectData();
    
        while (myObject != null) {
             try {
                  output.writeUnshared(myObject);
                  output.reset();
                  output.flush();
             } catch (Exception e) {
                  e.printStackTrace();
                  break;
             } // catch
        } // while
    
        try {
             output.close();
             socket.close();
        } catch (Exception e) { 
             System.out.println("Could not close.");
        }
    }