Java从套接字获取ObjectInputStream ObjectOutputStream

Java从套接字获取ObjectInputStream ObjectOutputStream,java,sockets,objectinputstream,objectoutputstream,Java,Sockets,Objectinputstream,Objectoutputstream,我有一个基于服务器-多客户端交互的应用程序。这是我在server类中用于创建一个新线程的线程,我在其中接受所有新套接字: Thread acceptingThread = new Thread(new Runnable() { @Override public void run() { while (true) { try { Socket s = serve

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

    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()));
注意这个
ObjectInputStream
构造函数的行为。从:

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

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

  • 从客户端连接。我想您已经在这样做了,因为您可以通过
    socket.accept()
  • 使用新连接打开一个
    OutputStream
  • ObjectOutputStream
    包装
    OutputStream
  • 通过
    ObjectOutputStream
    发送一些数据(即,将一些可序列化的数据写入其中并刷新)

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

                        listaOis.add(new ObjectInputStream(s.getInputStream()));
    
    注意这个
    ObjectInputStream
    构造函数的行为。从:

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

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

  • 从客户端连接。我想您已经在这样做了,因为您可以通过
    socket.accept()
  • 使用新连接打开一个
    OutputStream
  • ObjectOutputStream
    包装
    OutputStream
  • 通过
    ObjectOutputStream
    发送一些数据(即,将一些可序列化的数据写入其中并刷新)

  • 阅读ObjectInputStream构造函数的javadoc。我认为serverSocket.accept()正在阻止程序,它会等待新的请求。在我的客户端中,我正在创建一个连接到此服务器的套接字。在s中,我从客户端获取套接字。ObjectInputStream在其构造函数中获取一个InputStream。我从s.getInputStream()获得该结果阅读ObjectInputStream构造函数的javadoc。我认为serverSocket.accept()正在阻止程序,它会等待新的请求。在我的客户端中,我正在创建一个连接到此服务器的套接字。在s中,我从客户端获取套接字。ObjectInputStream在其构造函数中获取一个InputStream。我从s.getInputStream()获得该结果