0

我有一个客户端类和一个服务器类。如果我在 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(). 我可能没有正确处理流。有什么帮助吗?

4

2 回答 2

2

这段代码肯定有一些问题:

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

  • 您没有冲洗流。如果您在写入后不刷新,则无法保证序列化的表示将被发送到另一端……那里正在等待字节到达。

于 2013-04-23T06:16:15.043 回答
0

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

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

  2. 您在客户端修复它:您创建内部而不是创建方法Socket外部。虽然简单而肮脏的解决方案。mainSocketMethodA()

于 2013-04-23T06:00:39.417 回答