2012-04-13 3 views
1

Мне нужно создать приложение, которое может получать данные из сети и использовать эти данные, чтобы делать некоторые не относящиеся к делу вещи.Сокеты в Java ...?

Вот фрагмент кода, чтобы ясное представление о том, что я делаю.

На стороне сервера:

static Socket client = null; 
static ServerSocket ss = null; 

if (ss != null) { 
       ss.close(); 
      } 
      ss = new ServerSocket(5513); 
      isrunning = true; 
      System.out.println("Waiting for client..."); 
      client = ss.accept(); 
      System.out.println("Client accepted."); 
      BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream())); 

И на стороне клиента:

Socket client = null; 
PrintWriter out = null; 
        try {        
         client = new Socket("hostname", 5513); 
         out = new PrintWriter(client.getOutputStream(), true); 
    } 

Пожалуйста, обратите внимание, что это просто кусок кода. Ошибок в коде нет.

После запуска серверной части кода он правильно ожидает подключения клиента.

Теперь возникает проблема. Как только я пытаюсь подключиться со стороны клиента, я получаю «соединение отказано» -error.

ОДНАКО, я нашел что-то в Интернете, который сказал мне, чтобы я попробовал telnetting с клиентской стороны. Например, пусть серверный IP-адрес будет 192.168.1.1. Итак, после использования этой команды:

telnet 192.168.1.1 5513 

Фактически я получаю подключение к серверу. Команда запустит пустой экран, и все, что я вручную напечатаю в командной строке, будет отправлено на серверную сторону после нажатия enter (проверено с помощью отладки).

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

Любой, кто знает, что я делаю неправильно?

+0

Я не уверен, почему именно вы терпите неудачу, но я получил сокеты, которые легко запускались с помощью этих двух учебников: http://android-er.blogspot.com/2011/01/implement-simple-socket-server-in. html и http://android-er.blogspot.com/2011/01/simple-communication-using.html – HannahMitt

+0

@ Ханна Митт, он забыл цикл while. Сервер даже не прослушивает подключения более чем на секунду. Как только сервер делает одно соединение, это делается и больше не будет слушать. –

+0

Как я уже сказал, это всего лишь фрагмент кода. На самом деле я использую цикл while. Кроме того, метод accept() будет ожидать установления соединения, поэтому я могу позволить серверу ждать часа, чтобы установить первое соединение. После этого он начнет цикл с другого соединения. –

ответ

3

Этот код вы фактически используете?

client = new Socket("hostname", 5513); 

Попробуйте изменить его:

client = new Socket("192.168.1.1", 5513); 
+0

Это сработало! Благодарю. –

0

Вы на самом деле не используете «hostname» в своем объекте Socket на клиенте, не так ли?

Он должен 192.168.1.1.

0

Вы на Windows? и если это так, вы добавили java.exe и javaw.exe в брандмауэр с включенным и исходящим? и добавили ли вы правило для 5513 на свой брандмауэр?

Если да Windows, но нет настроек брандмауэра, это ваш ответ, откройте свой брандмауэр.

2

client = new Socket("hostname", 5513); Имя хоста должно представлять IP-адрес, к которому вы подключаетесь. Если вы пытаетесь подключиться к себе, это будет «localhost»

Кроме того, сервер не прослушивает клиента ВСЕ ВРЕМЯ, должен быть цикл while, чтобы сервер прослушивал и принимал подключения.

while (true) { 
    client = ss.accept(); 
    out = new PrintWriter(client.getOutputStream(), true); 
    //You should probably assign it to a seperate thread to handle stuff for this client 
} 

И я должен объяснить, почему вы получаете эту конкретную ошибку.Когда что-то говорит о том, что соединение отказано, обычно это означает, что IP-адрес, с которым вы хотите подключиться, знает вашу отправку соединения и блокирует его, потому что он не прослушивает это соединение. В принципе, когда сервер закрыт, вы перестали слушать клиента, поэтому все, что попадало на этот порт, было бы заблокировано. Конечно, в другом случае может быть, что Java заблокирован на вашем брандмауэре, и для него должно быть сделано исключение. Хотя это редко бывает, если то, что вы пытаетесь выполнить, связано с локальной сетью.

+0

Это неудобно, и замена имени хоста на IP-адрес действительно работает. –

+0

Ввод имени хоста работает для подключения к локальной сети, потому что я тестировал это до и установил соединение. Но для большей точности в ваших подключениях я бы придерживался IP-адресов. Не говоря уже о том, что метод более простой и прямой. Я бы использовал только имена хостов для подключения к веб-сайту. Единственным исключением является «localhost», что означает «IP-адрес« Мой компьютер », –

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