Java:第二次使用套接字时挂起

时间:2013-04-23 04:04:47

标签: java sockets stream

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

2 个答案:

答案 0 :(得分:2)

这段代码肯定存在一些问题:

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

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

答案 1 :(得分:0)

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

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

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