我有一个客户机类和一个服务器类。有一个客户端方法,我用它来调用服务器和我的代码挂起,如果我尝试使用这个方法在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
时,它不会从服务器获得响应。有两种方法可以修复它。
-
您可以在服务器端进行修改:这将是一个精心设计的更改,但可以更好地利用资源。在流关闭之前,您不会停止读取流。
-
您在客户端修复它:而不是在
main
方法之外创建Socket
,而是在MethodA()
中创建Socket
。