2014-10-21 3 views
1

в моей игре мне нужно проверить получение данных от любого из подключенных сокетов (клиентов). клиенты, которые подключены, сохраняются в массиве. есть ли способ проверить получение от любого из подключенных клиентов? Я попробовал цикл for для всех подключенных клиентов/сокетов и проверял их, но он, похоже, не работает. heres my for loopпроверить для получения информации из всех сокетов, подключенных к серверному сокету java

while (true) { 
     try { 
      for (Socket client : Server.clients) { 
       Server.in = new DataInputStream(client.getInputStream()); 
       System.out.println("recieving information..."); 
       String input = Client.in.readUTF(); 

       Server.out = new DataOutputStream(client.getOutputStream()); 
       Server.out.writeUTF("connected"); 
       send(input); 
      } 
     } catch (Exception e) { 
     } 
    } 

, но я думаю, что он проверяет только одного клиента за раз. также он не помогает, что я могу отправлять данные неправильно (или другие ошибки), поэтому его трудно найти проблему. Благодарю.

+0

Не могли бы вы не просто проверить, что 'Server.in.available()> 0 'перед выполнением чтения? Это предотвратит любые проблемы с блокировкой, с которыми вы сталкиваетесь – Crollster

ответ

1

client.in.readUTF() собирается заблокировать ваш код, пока конкретный сокет не будет иметь данные для чтения, поэтому ваш цикл будет застревать. Для этого вы захотите создать новый объект Thread каждый раз, когда вы получите соединение на своем ServerSocket. Что-то вроде этого:

//receive new socket 
new Thread(new Runnable() { 
    public void run() { 
     //while loop that waits for input on the socket 
    } 
}).start(); 

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

EDIT: Pastebin с примерами кода

+0

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

+0

Я думаю, что я тоже не мог бы инициировать новый истинный путь. У меня есть мой новый поток, называемый как ServerThread serverin = new ServerThread (10); Тема t = новая Thread (serverin); t.start(); и мой класс как public ServerThread (int var) { this.var = var; } общественного недействительного запуск() { \t в то время (правда) { \t}} –

+0

Это лучше поставить каждый клиент в отдельном потоке, да. Я не совсем уверен, что делает int для 'ServerThread', но если вы хотите подклассировать« Thread », лучше всего перейти в' Socket', поскольку вы получите их из 'ServerSocket', тогда' ServerThread' может прослушивать этот сокет и обрабатывать всю входящую информацию, а также отправлять информацию по ее отдельному «Socket». –