我正在嘗試編寫客戶端服務器應用程序。 客戶發佈服務請求,服務器接收它們並將其顯示在科技室中。如何知道套接字何時閒置?
一切都很好,直到我試圖發送一個屏幕捕獲到一個特殊的管理客戶端,應該接收活動請求列表的屏幕截圖。
我的主服務器監聽線程看起來像這樣:
while (true) {
clientSocket = echoServer.accept();
log.debug("Server Started Listening");
is = new DataInputStream(clientSocket.getInputStream());
os = new PrintStream(clientSocket.getOutputStream());
// An option for a stop listening button. currently not available !
if(listening==true) {
line = is.readUTF();
os.println(line);
System.out.println(line);
RequestReciever.pharseToRequest(line);
}
的pharseToRequest方法是這樣的:
public static void pharseToRequest(String input) {
List<String> list = new ArrayList<String>(Arrays.asList(input.split(";;;")));
if (list.get(0).equalsIgnoreCase("Login") && list.get(1).equalsIgnoreCase("Login") && list.get(2).equalsIgnoreCase("5"))
{
_adminClients.add(list.get(4));
updateScreenCapture();
AdminClientUpdate tmp = new AdminClientUpdate(list.get(4));
Thread aCU = new Thread (tmp);
aCU.start();
}
else
{
ServerRequest newReq = new ServerRequest(list.get(0), list.get(1), Integer.parseInt(list.get(2)),list.get(3),list.get(4));
addRequest(newReq);
}
}
當客戶端發送 「登錄」 作爲數據
,我將他視爲ADMIN CLIENT,並通過AdminclientUpdate線程嘗試將其發送給屏幕截圖。
當客戶端發送常規數據時,我只是使用「addRequest」方法在服務器屏幕上更新它。
我遇到的問題是當我嘗試發送屏幕截圖時,它會找到它到管理客戶端的路,並且會在那裏正確更新,但是我的服務器出現錯誤並停止工作。
我懷疑它可能與監聽線程仍然有數據在舊的請求中,而AdminclientUpdate線程正在傳輸數據或什麼的。
這是錯誤我從服務器獲取,之後發送截屏:
java.io.EOFException
at java.io.DataInputStream.readUnsignedShort(Unknown Source)
at java.io.DataInputStream.readUTF(Unknown Source)
at java.io.DataInputStream.readUTF(Unknown Source)
at ListeningThread.run(ListeningThread.java:50)
at java.lang.Thread.run(Unknown Source)
的的ServerSocket.accept()continutes讀書如剛剛收到從客戶端, 當一個新的請求它真的沒有... ,而不是暫停和等待一個新的請求...
我堅持了兩個星期,現在,非常沮喪。
請幫助。
David。
您的服務器應該啓動一個新線程來處理每個接受的連接,而不是在接受線程中處理每個連接。 – EJP
我已經設法解決了一些問題。在第一次客戶端登錄時一切正常。現在我正在尋找一種方法來初始化來自服務器的更新**,當客戶端發生變化時。爲了做到這一點,我還必須在客戶端添加一個serversocket嗎?還是有沒有其他更優雅的方法來做到這一點? –