繁体   English   中英

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

[英]Strange Java Socket Behavior (Connects, but Doesn't Send)

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

对于两个连续的连接(我连接一次,工作,断开连接,然后再次连接,工作和断开连接),一切工作正常。 客户端进行连接,开展业务,然后关闭。 服务器成功关闭了对象输出流和套接字,没有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.");
    }
}

客户

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表示流的结尾。 只有EOFException表示。 任何其他IOException都应打印或记录。 显然,您在这里遇到了其他一些异常而忽略了它。

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

从ObjectInputStream API读取readUnshared():

从ObjectInputStream读取“非共享”对象。 此方法与readObject相同,除了它防止随后对readObject和readUnshared的调用返回对通过此调用获得的反序列化实例的附加引用。

这可能是问题吗? 使用readObject()代替。

暂无
暂无

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

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