2016-08-10 2 views
0

Сценарий:
а) Постоянные соединения
б) управлять каждым сервером-связи клиента в отдельности
с) Защита системы от распространяющихся исключений/ошибок
Как запустить два экземпляра 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 в конструкторе; и провести цикл accept() в методе run(). В настоящее время вы блокируете конструктор, ожидающий соединения, и ваши серверы будут обрабатывать только одно соединение.

Более интересный вопрос заключается в том, почему вы хотите предоставить одну и ту же услугу на двух портах.

+0

Вы не можете изолировать клиентов или проблемы со связью при работе с тем же кодом на обоих портах. Я ожидал, что любой компетентный программист сможет включить этот ответ в код. Это не бесплатный сервис кодирования. – EJP

+0

Мне интересно, понимаете ли вы, что вы можете принимать несколько подключений через один и тот же прослушивающий сокет. Вот как работают все TCP-серверы, и именно поэтому я упомянул цикл accept. – 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 и передать номер порта через конструктор, который я знаю, но это для удобства понимания. –

Смежные вопросы