ObjectInputStream的(socket.getInputStream()); 不起作用

我正在编写一个类来与服务器进行通信,但是当它尝试在输入流的帮助下构造ObjectInputStream时程序正在冻结。 Theres没有exception,程序仍然在运行,但挂起在它试图构造ObjectInputstream的行中。

下面是我的问题所在方法的代码:

@Override public void connect(String ip, int port) throws UnknownHostException, IOException { Socket socket = new Socket(ip, port); out = new ObjectOutputStream(socket.getOutputStream()); InputStream is = socket.getInputStream(); in = new ObjectInputStream(is); } 

这是整个class级的代码:

 package Client; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.PrintWriter; import java.net.Socket; import java.net.UnknownHostException; public class MessageStreamerImpl implements MessageStreamer { ObjectOutputStream out; ObjectInputStream in; public MessageStreamerImpl(String ip, int port) throws UnknownHostException, IOException{ connect(ip, port); } public MessageStreamerImpl(){ } @Override public void send(Object message) throws IOException { if(out == null) throw new IOException(); out.writeObject(message); out.flush(); } @Override public Object receive() throws IOException{ try { return in.readObject(); } catch (ClassNotFoundException e) { throw new IOException(); } } @Override public void connect(String ip, int port) throws UnknownHostException, IOException { Socket socket = new Socket(ip, port); out = new ObjectOutputStream(socket.getOutputStream()); InputStream is = socket.getInputStream(); in = new ObjectInputStream(is); } } 

在查看Google时,我发现了这个: http : //www.coderanch.com/t/232944/threads/java/Socket-getInputStream-block 。 但是我仍然不知道如何解决这个问题,因为我的ObjectOutputStream构造函数在ObjectInputStream之前。

这是我的服务器代码,也许它会有所帮助;)

 package Server; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.net.ServerSocket; import java.net.Socket; import java.net.SocketException; import java.util.ArrayList; public class Server { ArrayList clients = new ArrayList(); public Server(int port){ try { ServerSocket mySocket = new ServerSocket(port); waitForClients(mySocket); } catch (IOException e) { System.out.println("Unable to start."); e.printStackTrace(); } } private void waitForClients(ServerSocket mySocket) { while(true){ try { System.out.println("Ready to receive"); Socket client = mySocket.accept(); clients.add(client); System.out.println(client.getInetAddress().getHostAddress()+" connected to the Server"); Thread t = new Thread(new ClientHandler(client)); t.start(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } public void shareToAll(Object objectToSchare){ for(Socket client:clients){ ObjectOutputStream oos; try { oos = new ObjectOutputStream(client.getOutputStream()); oos.writeObject(objectToSchare); oos.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } private class ClientHandler implements Runnable{ Socket clientSocket; public ClientHandler(Socket clientSocket){ this.clientSocket = clientSocket; } @Override public void run() { try { ObjectInputStream ois = new ObjectInputStream(clientSocket.getInputStream()); while(true){ try { ois.readObject(); } catch (ClassNotFoundException | IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }catch(SocketException e){ System.out.println(clientSocket.getInetAddress().getHostAddress()+" disconnected from the Server"); clients.remove(clientSocket); }catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } 

谢谢你的帮助我找到了错误。 它在服务器类中必须如下所示:

 package Server; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.net.ServerSocket; import java.net.Socket; import java.net.SocketException; import java.util.ArrayList; public class Server { ArrayList clientstreams = new ArrayList(); public Server(int port){ try { ServerSocket mySocket = new ServerSocket(port); waitForClients(mySocket); } catch (IOException e) { System.out.println("Unable to start."); e.printStackTrace(); } } private void waitForClients(ServerSocket mySocket) { while(true){ try { System.out.println("Ready to receive"); Socket client = mySocket.accept(); clientstreams.add(new ObjectOutputStream(client.getOutputStream())); System.out.println(client.getInetAddress().getHostAddress()+" connected to the Server"); Thread t = new Thread(new ClientHandler(client)); t.start(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } public void shareToAll(Object objectToSchare){ for(ObjectOutputStream stream:clientstreams){ try { stream.writeObject(objectToSchare); stream.flush(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } private class ClientHandler implements Runnable{ Socket clientSocket; public ClientHandler(Socket clientSocket){ this.clientSocket = clientSocket; } @Override public void run() { try { ObjectInputStream ois = new ObjectInputStream(clientSocket.getInputStream()); while(true){ try { ois.readObject(); } catch (ClassNotFoundException | IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }catch(SocketException e){ System.out.println(clientSocket.getInetAddress().getHostAddress()+" disconnected from the Server"); clientstreams.remove(clientSocket); }catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } 

你在方法waitForClients()中看到的变化最多,但我也改变了我的ArrayList和shareToAll方法的概念。

ObjectInputStream构造函数从给定的InputStream中读取数据。 为了使其工作,您必须在构造之后立即刷新ObjectOutputStream(以编写初始头),然后再尝试打开ObjectInputStream。 另外,如果要为每个连接发送多个对象,则必须打开ObjectOutputStream一次并将其用于套接字的生命周期(例如,您的shareToAll方法)。