Java从套接字

时间:2017-04-11 06:24:02

标签: java sockets 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 个答案:

答案 0 :(得分:1)

您的代码在此特定行中被阻止:

ObjectInputStream

记下此InputStream构造函数的行为。来自Javadoc

  

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

从传入连接获取socket.accept()意味着需要通过连接发送序列化数据。这意味着您必须在构造函数继续之前执行以下操作:

  1. 从客户端连接。我认为你已经这样做了,因为你可以通过OutputStream
  2. 使用新连接打开OutputStream
  3. ObjectOutputStream包裹ObjectOutputStream
  4. 通过{{1}}发送一些数据(即将一些可序列化数据写入其中并刷新)。