2014-03-06 189 views
-1

我正在使用Java IO/NIO。我爲TCP和UDP(Java IO)實現了許多服務器/客戶端應用程序,並且最近開始使用NIO。Java IO/NIO:服務器可以在多個端口上偵聽嗎?

我想寫一個服務器(TCP或UDP),它執行多個任務,同時收聽多個端口。我一直實現服務器一次收聽單個端口,而我的問題可能違背了最佳實踐。但有什麼辦法可以讓服務器在多個端口上接受客戶端?像單個服務器中的多臺服務器一樣?

我不是在尋找代碼,只是程序的概念/設計,如果可能的話。

服務器:

public class ServerAll implements Runnable { 

private Socket connection; 

ServerAll(Socket s) { 
    this.connection = s; 
} 

public static void main(String[] args) { 
    int port1 = 7777; 
    int port2 = 8888; 
    int port3 = 9999; 
    int count = 0; 
    try{ 
     ServerSocket server1 = new ServerSocket(port1); 
     ServerSocket server2 = new ServerSocket(port2); 
     ServerSocket server3 = new ServerSocket(port3); 

     System.out.println("Server Initialized"); 
     while (true) { 
     Socket con1 = server1.accept(); 
     Runnable runnable1 = new ServerAll(con1); 
     Thread thread1 = new Thread(runnable1); 
     thread1.start(); 

     Socket con2 = server2.accept(); 
     Runnable runnable2 = new ServerAll(con2); 
     Thread thread2 = new Thread(runnable2); 
     thread2.start(); 

     Socket con3 = server3.accept(); 
     Runnable runnable3 = new ServerAll(con3); 
     Thread thread3 = new Thread(runnable3); 
     thread3.start(); 
     } 
    } 
    catch (Exception e) {} 
} 

public void run() { 
    try { 
     DataInputStream in = new DataInputStream(connection.getInputStream()); 
     String clientMsg = in.readUTF(); 
     String replyMsg = null; 

     if(clientMsg.equalsIgnoreCase("1")){ 
      String msg = "Server Reply on 1"; 
      replyMsg=msg; 
     } 

     if(clientMsg.equalsIgnoreCase("2")){ 
      String msg = "Server Reply on 2"; 
      replyMsg=msg; 
     } 

     if(clientMsg.equalsIgnoreCase("3")){ 
      String msg = "Server Reply on 3"; 
      replyMsg=msg; 
     } 

     DataOutputStream out = new DataOutputStream(connection.getOutputStream()); 
     out.writeUTF(replyMsg); 
    } 
    catch (Exception e) { 
     System.out.println(e); 
    } 
    finally { 
     try { 
      connection.close(); 
     } 
     catch (IOException e){} 
    } 
} 

客戶:

public class ClientTcpE { 

public static void main(String[] args) { 
    String host = "localhost"; 
    int port = 7777; 
    System.out.println("SocketClient initialized"); 
    try { 
     InetAddress address = InetAddress.getByName(host); 
     Socket client = new Socket(address, port); 
     System.out.println("Just connected to "+ client.getRemoteSocketAddress()); 
     OutputStream outToServer = client.getOutputStream(); 
     DataOutputStream out = new DataOutputStream(outToServer); 
     out.writeUTF("1"); 
     System.out.println("Just sent msg to server"); 

     InputStream inFromServer = client.getInputStream(); 
     DataInputStream in = new DataInputStream(inFromServer); 
     String serverMsg = in.readUTF(); 

     System.out.println("server says : "+serverMsg); 
     client.close(); 
    }catch(IOException e){ 
     e.printStackTrace(); 
    } 
} 
+0

NIO什麼?什麼UDP?除了TCP和java.net這裏什麼都沒有。 – EJP

+0

代碼稍後添加,基本上問題不限於TCP(在提供的代碼中使用)。 –

回答

1

是的肯定。最簡單的方法是創建一個線程,每個線程創建一個ServerSocket,綁定到一個端口,然後在其上調用accept

+0

剛做了你剛纔提到的,我之前也做過。但是當我嘗試再次在同一個端口上運行同一個客戶端時,它不起作用。程序運行並且沒有來自服務器的回覆。是否由於Java IO的阻塞語句? –

+0

@ kami101這意味着你的代碼中有一個bug。 –

+0

@ kami101 - 你的代碼(上面)不會做我說的。您需要在子線程中執行接受調用...而不是在主線程中。 –

0

您一次只接受一個端口,即accept()都在同一個線程中。您只能爲每個客戶端處理一條消息。您編寫代碼的方式,客戶端必須按順序聯繫三個端口,重複。

如果要接受不同的端口連接的同時,你將不得不使用每個爲這個阻塞操作的線程(或使用無阻塞NIO)

+0

感謝您指出正確的方向。 –

相關問題