2014-02-10 82 views
0

我正在嘗試編寫客戶端服務器應用程序。 客戶發佈服務請求,服務器接收它們並將其顯示在科技室中。如何知道套接字何時閒置?

一切都很好,直到我試圖發送一個屏幕捕獲到一個特殊的管理客戶端,應該接收活動請求列表的屏幕截圖。

我的主服務器監聽線程看起來像這樣:

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。

+0

您的服務器應該啓動一個新線程來處理每個接受的連接,而不是在接受線程中處理每個連接。 – EJP

+0

我已經設法解決了一些問題。在第一次客戶端登錄時一切正常。現在我正在尋找一種方法來初始化來自服務器的更新**,當客戶端發生變化時。爲了做到這一點,我還必須在客戶端添加一個serversocket嗎?還是有沒有其他更優雅的方法來做到這一點? –

回答

0

在我的情況下服務器應該啓動一個新的線程來處理每個接受的連接,而不是在接受線程中處理每一個內聯。 但我也試圖通過serversocket而不是登錄初始化來獲得第一次更新。 現在,在登錄後獲得第一次更新後,我在客戶端添加了一個服務器套接字,因此它將繼續監聽來自服務器的進一步更新。

EJP的想法給了我第一個領導。