2012-06-13 5 views
1

Я создал сервер в java, который принимает клиентские соединения. Но я могу подключить только одного клиентаСокет принимает только одного клиента

class Server extends Thread{ 

    private void startServer() { 

    try{ 
     ss=new ServerSocket(3000); 
     s=ss.accept(); 
     DataRead d1=new DataRead();   
     d1.t.start(); 



     }catch(Exception er){ 
      er.printStackTrace(); 
     } 
     }           
    } 
+0

, пожалуйста, проигнорируйте класс Conn., Я забыл удалить его из кода сервера. – dpanshu

+1

Вам нужно сделать больше отладки в первую очередь. 1. Работает ли он в одном и том же процессе, на одном и том же компьютере и т. Д. 2. Вам нужно проверить, что данные отправлены в правильном формате и также получены в правильном порядке. Инструмент дампа TCP, такой как wirehark, может помочь вам. Как только вы определите, где ошибка, вернитесь сюда и подробно спросите о результатах. В целом задача состоит в том, чтобы вы сначала определили, где ошибка, - тогда люди могут помочь вам изолировать исправление. –

+0

Проблема заключается в том, что когда я запускаю сервер и запускаю клиент на том же компьютере, он делает то, что ожидает программа, т.е. все сообщения отображаются на сервере, а также на клиенте (эхо), но когда я запускаю другой экземпляр клиента, он подключается, но никакие сообщения не передаются по разлому, и нет эха. – dpanshu

ответ

2

Вы принимаете только один разъем. В вашей jButton1ActionPerformed у вас есть

s=ss.accept(); 

Но это вызывается только один раз , при нажатии на кнопку jButton1. Вам нужно продолжать звонить accept(), если вы хотите, чтобы несколько клиентов могли подключаться.

Также имейте в виду, что каждый вызов accept() будет блокироваться до тех пор, пока клиент не подключится, а затем вернет новый сокет, представляющий это соединение. Поэтому, если вы хотите поддерживать несколько клиентов, вы не должны иметь свой Socket в качестве глобальной переменной, он должен быть включен в конструктор вашего класса DataRead, поэтому каждый читатель работает с уникальным сокетом/соединением/клиентом.

+0

ОК, я попытаюсь это сделать, я понял. – dpanshu

+0

Фактически я думал сделать два потока, один для приема соединений и других для ввода-вывода с сервера. это возможно? – dpanshu

+0

Удачи! Возможно, вам захочется запустить отдельный поток, который обрабатывает сервер-сокет (вызывает 'accept()') – pap