2017-04-11 70 views
0

我有一个基于服务器 - 多个客户端交互的应用程序。这是我在服务器类中使用的线程创建一个新线程,我接受所有新套接字:Java从套接字获取ObjectInputStream ObjectOutputStream

Thread acceptingThread = new Thread(new Runnable() { 

     @Override 
     public void run() { 
      while (true) { 
       try { 
        Socket s = serverSocket.accept(); 
        listaSocket.add(s); 
        listaOis.add(new ObjectInputStream(s.getInputStream())); 
        listaOos.add(new ObjectOutputStream(s.getOutputStream())); 
        System.out.println("Client connected"); 
       } catch (IOException ex) { 
        Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex); 
       } 
      } 

     } 

    }); 
    acceptingThread.start(); 




private ServerSocket serverSocket; 
private ArrayList<Socket> listaSocket; 
private ArrayList<ObjectInputStream> listaOis; 
private ArrayList<ObjectOutputStream> listaOos; 

阻断程序的行是:

    listaOis.add(new ObjectInputStream(s.getInputStream())); 
        listaOos.add(new ObjectOutputStream(s.getOutputStream())); 
+1

阅读ObjectInputStream构造函数的javadoc。 –

+1

我认为serverSocket.accept()是阻止程序,它等待新的请求来。 –

+0

在我的客户端我正在做一个套接字连接到这台服务器。在我从客户端获取套接字。ObjectInputStream需要一个InputStream在他的构造函数。我从s.getInputStream() – Cristian

回答

1

您的代码在该特定线阻断:

    listaOis.add(new ObjectInputStream(s.getInputStream())); 

注意这个ObjectInputStream构造函数的行为。从Javadoc

创建从指定的InputStream读取的ObjectInputStream。从流中读取序列化流头并进行验证。 此构造函数将阻塞,直到相应的ObjectOutputStream写入并刷新标题。

获取从传入连接的InputStream意味着需要串行化的数据通过所述连接发送。这意味着您必须在构造函数继续之前执行以下操作:

  1. 从客户端连接。我认为你已经这样做了,因为你可以通过socket.accept()
  2. 使用新连接打开OutputStream。用ObjectOutputStream包装OutputStream
  3. 通过ObjectOutputStream发送一些数据(即写入一些可序列化的数据并刷新)。
相关问题