簡體   English   中英

Java從套接字獲取ObjectInputStream ObjectOutputStream

[英]Java getting ObjectInputStream ObjectOutputStream from a socket

我有一個基於服務器與多個客戶端交互的應用程序。這是我在服務器類中用於創建新線程的線程,在該線程中我接受所有新套接字:

    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()));

您的代碼在以下特定行中受阻:

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

注意此ObjectInputStream構造函數的行為。 Javadoc

創建一個ObjectInputStream,它從指定的InputStream中讀取。 從流中讀取並驗證序列化流頭。 該構造函數將阻塞,直到相應的ObjectOutputStream寫入並刷新了頭為止。

從傳入連接獲取InputStream意味着需要通過連接發送序列化數據。 這意味着在構造函數繼續之前,您必須執行以下操作:

  1. 從客戶端連接。 我認為您已經在執行此操作,因為可以通過socket.accept()
  2. 使用新的連接打開一個OutputStream
  3. ObjectOutputStream包裝OutputStream
  4. 通過ObjectOutputStream發送一些數據(即,將一些可序列化的數據寫入其中並刷新)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM