我有一个客户端类和一个服务器类。有一个客户端方法,我用来调用服务器,如果我在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()
几次调用服务器。我可能没有正确处理流。有什么帮助吗?
答案 0 :(得分:2)
这段代码肯定存在一些问题:
您正在相同的流之上重复创建ObjectInputStream和ObjectOutputStream。这不是他们应该如何使用的方式。你应该做的是创建一次ObjectXxxStream,然后在同一个ObjectXxxStream上多次调用readObject或writeObject。如果要多次发送同一个对象,则需要在再次写入对象之前调用reset
。
你没有冲洗溪流。如果您在写入后没有刷新,则无法保证序列化表示将被发送到另一端...等待字节到达的地方。
答案 1 :(得分:0)
您的服务器端代码的编写方式是只读取一个对象,并只将一个对象写入新创建的Socket
。因此,您尝试在第二次或第n次重用Socket
时,它不会从服务器返回响应。有两种方法可以解决它。
您可以修复服务器端:这将是一个精心设计的更改,但更好地利用资源。在关闭之前,您不会停止阅读该流。
您在客户端修复它:不是在Socket
方法之外创建main
,而是在Socket
内创建MethodA()
。简单而肮脏的解决方案。