![](/img/trans.png)
[英]Socket ObjectInputStream and ObjectOutputStream not working
[英]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
意味着需要通過連接發送序列化數據。 這意味着在構造函數繼續之前,您必須執行以下操作:
socket.accept()
OutputStream
。 ObjectOutputStream
包裝OutputStream
。 ObjectOutputStream
發送一些數據(即,將一些可序列化的數據寫入其中並刷新)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.