2016-08-10 121 views
0

場景:
一個)持久連接
b)中管理各服務器 - 客戶機通信單獨
c)中從傳播異常/錯誤
如何運行監聽兩個不同端口的兩個java套接字服務器實例?

我使用試圖服務器套接字收聽者創建了兩個實例防護系統下面的代碼:

SimpleSocketServers.java

public class SimpleSocketServers { 

    public static void main(String[] args) throws Exception { 
     int port1 = 9876; 
     SimpleSocketServer server1 = new SimpleSocketServer(port1); 
     server1.startAndRunServer(); 
     System.out.println("Servers : server1 Listening on port: " + port1); 

     int port2 = 9875; 
     SimpleSocketServer server2 = new SimpleSocketServer(port2); 
     server2.startAndRunServer(); 
     System.out.println("Servers : server2 Listening on port: " + port2); 
    } 
} 


SimpleSocketServer.java

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

    public class SimpleSocketServer { 

     private ServerSocket serverSocket; 
     private int port; 

     public SimpleSocketServer(int port) { 
      this.port = port; 
     } 

     public void startAndRunServer() { 
      try { 
       System.out.println("Starting Server at port " + port + " ..."); 
       serverSocket = new ServerSocket(port); 
       System.out.println("Listening for client connection ..."); 
       Socket socket = serverSocket.accept(); 
       RequestHandler requestHandler = new RequestHandler(socket); 
       requestHandler.start(); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    } 

class RequestHandler extends Thread { 

    private Socket socket; 

    RequestHandler(Socket socket) { 
     this.socket = socket; 
    } 

    @Override 
    public void run() { 
     try { 
      System.out.println("Client Request Response being processed..."); 
      BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
      PrintWriter out = new PrintWriter(socket.getOutputStream()); 


     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 

但是,它作爲控制不從一審的構造函數返回只創建一個實例。是否有可能重新獲得控制權並同時運行服務器套接字偵聽器的兩個實例? (ps:請原諒我,如果它是錯誤的或瑣碎的!)

回答

1

您需要有SimpleSocketServer工具Runnable;以構造函數中的Runnable開始自己的線程;並在run()方法中運行accept()循環。目前,您在構造函數中阻塞等待連接,並且您的服務器也將只處理單個連接。

更有趣的問題是爲什麼你想在兩個端口上提供相同的服務。

+0

當您在兩個端口上運行相同的代碼時,無法隔離客戶端或通信問題。我希望任何有能力的程序員都能夠把這個答案變成代碼。這不是免費的編碼服務。 – EJP

+0

我在想你是否理解你可以通過同一個監聽套接字接受多個連接。這就是所有TCP服務器的工作原理,這就是爲什麼我提到了一個接受循環的原因。 – EJP

0

使用2個不同的線程,聆聽2個不同的端口。

Thread ServerThread1 = new Thread(new Runnable() { 

    @Override 
    public void run() { 
     ServerSocket ServerSocketObject = null; 
     while(true) 
     { 
     try { 
      ServerSocketObject = new ServerSocket(Your_Port_Number1); 

       Socket SocketObject = ServerSocketObject.accept(); 
       // Your Code Here 
       SocketObject.close(); 

     } catch (IOException e) { 
       try { 
        ServerSocketObject.close(); 
       } catch (IOException e1) { 
        e1.printStackTrace(); 
       } 
      e.printStackTrace(); 
     } 
     } 
    } 
}); 

Thread ServerThread2 = new Thread(new Runnable() { 

    @Override 
    public void run() { 
     ServerSocket ServerSocketObject = null; 
     while(true) 
     { 
     try { 
      ServerSocketObject = new ServerSocket(Your_Port_Number2); 

       Socket SocketObject = ServerSocketObject.accept(); 
       // Your Code Here 
       SocketObject.close(); 

     } catch (IOException e) { 
       try { 
        ServerSocketObject.close(); 
       } catch (IOException e1) { 
        e1.printStackTrace(); 
       } 
      e.printStackTrace(); 
     } 
     } 
    } 
}); 

ServerThread1.start(); 
ServerThread2.start(); 
+0

這裏不需要兩組代碼。 – EJP

+0

你可以建議更新... –

+0

你可以創建一個擴展runnable的類,並通過構造函數傳遞端口號我知道,但這是爲了便於理解。 –

相關問題