2015-03-24 3 views
0

Я хочу, чтобы ServerSocket принимал 2 сокета, подключающихся к одному порту. Тем не менее, он не будет распечатывать то, что читается из BufferedReader, и сокеты после подключения по-прежнему равны нулю.Как заставить сервер принимать несколько сокетов на одном и том же порту

Вот код ServerSocket:

ServerSocket serverSocket = new ServerSocket(PORT); 
try { 
Socket con; 
int socketCounter= 0; 
Socket first, second; 
while (socketCounter!= 2) { 
     con = serverSocket.accept(); 
     String input; 
     BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream())); 
     if ((input = in.readLine()) != null) { 
      System.out.println(input); 
      if (input.equals("first")) { 
       first = con; 
      } else if (input.equals("second")) { 
       second = con; 
      } else { 
       continue; 
      } 
     } 
     socketCounter++; 
    } 
} catch (Exception e) { 
    e.printStackTrace(); 
} 

Вот "первый"

try { 
    first = new Socket(URL, PORT); 
ObjectOutputStream out = new ObjectOutputStream(first.getOutputStream()); 
ObjectInputStream in = new ObjectInputStream(first.getInputStream()); 
PrintWriter pw = new PrintWriter(new OutputStreamWriter(first.getOutputStream())); 
pw.println("first"); 
pw.flush(); 
} catch(Excpetion e){ 
    e.printStackTrace(); 
} 

Во-вторых, в основном то же самое:

try { 
    second = new Socket(URL, PORT); 
ObjectOutputStream out = new ObjectOutputStream(second.getOutputStream()); 
ObjectInputStream in = new ObjectInputStream(second.getInputStream()); 
PrintWriter pw = new PrintWriter(new OutputStreamWriter(second.getOutputStream())); 
pw.println("second"); 
pw.flush(); 
} catch(Excpetion e){ 
    e.printStackTrace(); 
} 

Я бы предпочтительно хочу это сделать однопоточный, однако, если нет, все в порядке. Может ли кто-нибудь помочь?

+0

Любая конкретная причина, по которой вы хотите использовать однопоточность? Это сделает вашу жизнь намного сложнее –

+0

Нет причин. Однако, только чтобы сделать это немного легче, это может усложнить ситуацию. – user2874945

ответ

1

При создании ServerSocket вы должны определить порт, который он будет использовать для прослушивания клиентских запросов. Каждый раз, когда ServerSocket получает запрос, этот запрос будет перенаправлен на другой порт, определенный сервером. Обычно мы создаем новый поток и связываем с ним работу клиента. Отметьте этот пример: http://www.oracle.com/technetwork/java/socket-140484.html

+0

Я забыл включить, что серверное пространство было создано до try-catch. Я обновлю сообщение. Спасибо за ссылку. В этом примере каждый клиент делает то же самое, однако «первый» и «второй» выполняет разные вещи. Вот почему я проверяю ввод. – user2874945

+0

@ user2874945, чтобы заставить их делать разные вещи. Создайте два класса, которые расширяют «Thread», один для первого и один для второго, а затем, когда вы получите соединение, проверьте свой ввод и запустите соответствующий поток. –

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