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

时间:2010-05-21 21:07:37

标签: java sockets objectoutputstream

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

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

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

我采取了以下内存预防措施:

  1. 当关闭套接字时,所有正在运行的线程都会停止,所有对象都会被清空。
  2. 每个writeUnshared()方法之后 调用,ObjectOutputBuffer是 刷新并重置。
  3. 有没有人遇到过类似的问题,或者有没有人有任何建议?我担心我的项目相当大,因此复制代码是有问题的。

    该项目归结为:

    SERVER MAIN

    ServerSocket serverSocket = new ServerSocket(port);
    
    while (true) {
        new WorkThread(serverSocket.accept()).start();
    }
    

    WORK THREAD(SERVER)

    public void run() {
        ObjectInputBuffer inputBuffer = new ObjectInputBuffer(new BufferedInputStream(socket.getInputStream()));
    
        while (running) {
             try {
                  Object myObject = inputBuffer.readUnshared();
    
                  // do work is not specified in this sample
                  doWork(myObject);
             } catch (IOException e) {   
                  running = false;
             }
        }
    
        try {
             inputBuffer.close();
             socket.close(); 
        } catch (Exception e) {
             System.out.println("Could not close.");
        }
    }
    

    客户端

    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.");
        }
    }
    

    感谢所有可能提供帮助的人!

2 个答案:

答案 0 :(得分:2)

答案 1 :(得分:0)

来自ObjectInputStream API的readUnshared():

  

从中读取“非共享”对象   ObjectInputStream的。这个方法是   与readObject相同,除了   它会阻止后续调用   readObject和readUnshared from   返回附加的引用   通过获得的反序列化实例   这个电话。

这可能是问题吗?改为使用readObject()。