2016-01-27 68 views
0

我正在使用套接字在Java中編寫我的第一個客戶端 - 服務器程序。我使用Eclipse作爲IDE。當我測試兩個程序(服務器和客戶端)之間的通信時,首先使用命令提示符運行服務器,然後在Eclipse中運行客戶端。一切正常,我可以讀取和寫入套接字,但是,當我關閉Eclipse中的客戶端程序時,服務器程序也關閉。這是爲什麼發生?服務器應該在命令提示符下自行運行,它不依賴於客戶端。爲什麼服務器在關閉客戶端時停止運行?

另外我想知道是否有任何可能我可以在Eclipse中運行這兩個程序,而不是先在命令提示符下打開服務器。

這裏是我的兩個程序代碼:

服務器:

import java.io.BufferedReader; 
import java.io.InputStreamReader; 
import java.io.PrintWriter; 
import java.net.ServerSocket; 
import java.net.Socket; 

public class ServerPrg { 

public static void main(String[] args) { 

    System.out.println("Server is running....."); 

    try { 
     ServerSocket socketSer = new ServerSocket(4444); 
     Socket clientSocket = socketSer.accept(); 

     PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true); 
     BufferedReader in = (new BufferedReader (new InputStreamReader(clientSocket.getInputStream()))); 

     BufferedReader stdIn = (new BufferedReader (new InputStreamReader(System.in))); 

     System.out.println("Client: " + in.readLine()); 

     String input ; 
     while((input = stdIn.readLine()) != null) 
      { out.println(input); 
       System.out.println("Client: " + in.readLine()); 
      } 
    } 

    catch (Exception e) {System.out.println("CAN'T CREATE SERVERSOCKET. PROBABLY THE PORT IS BEING USED " + e);} 

} //end main 
} //end public class 

客戶:

import java.io.BufferedReader; 
import java.io.InputStreamReader; 
import java.io.PrintWriter; 
import java.net.Socket; 

public class ClientPrg { 

public static void main(String[] args) { 

    int portNumber = 4444; 

    try { 
     Socket clientSocket = new Socket("127.0.0.1", portNumber); 
     PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true); 
     BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); 

     BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in)); 

     String input; 
     while ((input = stdIn.readLine()) != null) 
     { 
      out.println(input); 
      System.out.println("Server: " + in.readLine()); 
     } 


    } catch(Exception e) 
    { 
     System.out.println(e); 
     System.out.println("CAN'T CONNECT TO THE SERVER"); 
    } 

} //end main 
} // end public class 

回答

2

您的服務器沒有接受各地客戶的插座迴路。

這意味着,在您的客戶端套接字被接受後,它將退出,因爲沒有流控制元素會嘗試接受第二個客戶端套接字。

圍繞接受客戶端套接字的一個簡單的循環可能不是你想要的。這是因爲解決方案中只有一個線程,這意味着在處理客戶端時,其他客戶端將無法被接受。

有很多方法可以處理上述情況。最簡單的一種方法是爲每個接受的客戶端創建一個線程來處理客戶端的通信。雖然這最初很簡單,但它不能很好地擴展。對於大量的客戶端來說,線程數會增加,大多數計算機可以處理比線程多得多的網絡連接。

談到規模較好的服務的範圍在這裏講得很大;但是,在您熟悉每個客戶端處理的一個線程後,開始查看Java NIO。

+0

我沒有意識到這一點!第二個問題呢。謝謝! – c2J

+0

當然。只需創建兩個運行配置文件,但下次請將您的問題限制爲「每個問題一個問題」。乾杯! –

相關問題