2010-05-21 46 views
0

我有一个相当复杂的项目,归结为一个简单的客户端/服务器通过对象流进行通信。奇怪的Java套接字行为(连接,但不发送)

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

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

我采取了以下措施内存:

  1. 当谈到时间来关闭插座,所有正在运行的线程停止,所有的对象都清零了。
  2. 在每次调用writeUnshared()方法 后,ObjectOutputBuffer将被刷新并重置为 。

有没有人遇到类似的问题,或者没有人有任何建议吗?恐怕我的项目很大,所以复制代码是有问题的。

项目归结为:

服务器主

ServerSocket serverSocket = new ServerSocket(port); 

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

工作线程(服务器)

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

CLIENT

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

你有使用readUnshared与readObject的原因吗?这看起来对我来说很危险。 – mdma 2010-05-21 21:12:27

回答

2

(1)什么是ObjectInputBuffer和ObjectOutputBuffer?你的意思是ObjectInputStream & ObjectOutputStream? (2)如果是这样,创建ObjectOutputStream后立即调用reset()只是浪费时间和带宽。 (3)为什么在创建输出流的异常上打印'无法获得输入'? (4)当你得到一个例外时,你应该总是打印它的消息 - 不要完全用你自己的替代它,这只是扔掉有用的信息。

(5)您认为任何 IOException在读取时表示流结束。只有EOFException意味着。应该打印或记录任何其他IOException。显然你在这里得到一些其他例外,并忽略它。

(6)你为什么继续发送相同的对象?

0

从ObjectInputStream的API为readUnshared():

读取来自 ObjectInputStream的 “非共享” 对象。此方法是 相同的readObject,不同之处在于它 返回附加引用经由 此呼叫获得的 反序列化实例防止后续调用 的readObject和readUnshared从 。

这是问题吗?改用readObject()。