第二次使用套接字时挂起



我有一个客户机类和一个服务器类。有一个客户端方法,我用它来调用服务器和我的代码挂起,如果我尝试使用这个方法在jvm会话期间多次。

客户端代码的主方法:

methodA();
methodA();
ois.close(); //ObjectInputStream
oos.close(); //ObjrctOutputStream
is.close(); //InputStream
os.close(); //OutputStream
socket.close();

客户端代码的methodA()看起来像这样:

os = socket.getOutputStream();
oos = new ObjectOutputStream(os);
oos.writeObject(obj);
is = socket.getInputStream();
ois = new ObjectInputStream(is);
Object o = ois.readObject();

服务器代码的主方法如下:

while (true) {
    Socket socket = serverSocket.accept();
    is = socket.getInputStream();
    ois = new ObjectInputStream(is);
    Object o = ois.readObject();
    servermethod();
}
oos.close();
ois.close();
is.close();
os.close();
serverSocket.close();

服务器的serverMethod()看起来像:

os = socket.getOutputStream();
oos = new ObjectOutputStream(os);
Object ob = getObject() ; //this method is working fine
oos.writeObject(ob);

我想做的是让客户端调用服务器几次使用methodA()。我可能没有正确处理数据流。任何帮助吗?

这段代码肯定有一些错误:

  • 你在相同的流上重复创建ObjectInputStream和ObjectOutputStream。它们不应该这样被使用。您应该做的是创建一次ObjectXxxStream,然后在同一个ObjectXxxStream上多次调用readObject或writeObject。如果你多次发送相同的对象,你需要在再次写入对象之前调用reset

  • 您没有冲洗流。如果在写入后不刷新,就不能保证序列化的表示将被发送到另一端…

您的服务器端代码以只读取一个对象的方式编写,并且只将一个对象写入新创建的Socket。因此,在第二次或第n次尝试重用Socket时,它不会从服务器获得响应。有两种方法可以修复它。

  1. 您可以在服务器端进行修改:这将是一个精心设计的更改,但可以更好地利用资源。在流关闭之前,您不会停止读取流。

  2. 您在客户端修复它:而不是在main方法之外创建Socket,而是在MethodA()中创建Socket

相关内容

  • 没有找到相关文章