Java套接字编程


问题内容

我正在使用Java套接字构建一个简单的客户端/服务器应用程序,并尝试使用ObjectOutputStream等。

我一直在这个URL
http://java.sun.com/developer/technicalArticles/ALT/sockets上关注该教程,当它谈到通过套接字传输对象时,它从一半开始。

请参阅我为客户端提供的代码http://pastebin.com/m37e4c577但是,这似乎不起作用,我无法弄清楚什么不起作用。在底部注释掉的代码直接从教程中复制出来-
当我仅使用它而不是创建客户端对象时,此方法就起作用了。

谁能看到我做错了什么?


问题答案:

问题在于您创建流的顺序:

在文章(我假设您正在使用的服务器)中的服务器中,当打开新连接时,服务器首先打开一个输入流,然后打开一个输出流:

public Connect(Socket clientSocket) {
 client = clientSocket;
 try {
  ois = new ObjectInputStream(client.getInputStream());
  oos = new ObjectOutputStream(client.getOutputStream());
 } catch(Exception e1) {
     // ...
 }
 this.start();
}

注释后的示例代码使用相反的顺序,首先建立输出流,然后建立输入流:

// open a socket connection
socket = new Socket("localhost", 2000);
// open I/O streams for objects
oos = new ObjectOutputStream(socket.getOutputStream());
ois = new ObjectInputStream(socket.getInputStream());

但是您的代码反过来做了:

server = new Socket(host, port);
in = new ObjectInputStream(server.getInputStream());
out = new ObjectOutputStream(server.getOutputStream());

建立输出流/输入流对将停滞不前,直到他们交换了握手信息,因此您必须匹配创建顺序。您只需在示例代码中交换第34和35行即可。