2013-06-28 4 views
0

Я реализую клиент-серверное приложение. Я новичок в этом. Я попытался следующие статьи A Simple Java TCP Server and TCP ClientПростой Java-клиент-сервер: клиентский клиент подключается к серверу

На самом деле я уже есть клиент, который работает (не мой код)

Так я просто нужно написать сервер для этого.

Также мой сервер будет подключен только одним клиентом, поэтому я действительно не вижу необходимости поддерживать несколько клиентов.

Как я вижу, используя netstat -a, создается сервер прослушивания, но клиент не может подключиться к нему. Сообщение об ошибке не выдано ни о том, что является сюрпризом. Как будто вызов для соединения игнорируется. На клиенте никаких исключений не наблюдается.

Мой сервер код (возможно Неисправен)

private static void create_request_server(int requestport) { 
    // TODO Auto-generated method stub 

    try { 
     ServerSocket s1 = new ServerSocket(requestport); 
     requestsocket = s1.accept(); 
      // Do some stuff . But this accept never breaks. 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

Правильный Клиент

try { 
      fRequestSocket = new Socket("localhost", requestPort); 
      fRequestWriter = new PrintWriter(fRequestSocket.getOutputStream()); 
      fRequestReader = new BufferedReader(new InputStreamReader(fRequestSocket.getInputStream())); 


     } catch (UnknownHostException e) { 
      abort(" UnknownHostException", e); 
     } catch (IOException e) { 
      abort(" IOException", e); 
     } 

FYI

И мой клиент и сервер находятся на локальном хосте

Является ли мой сервер ужасно неправильным?

EDIT (Закрыть ответить)

SO с помощью ценных замечаний, размещенных ниже, я понял, что проблема есть. Проблема заключается между LOCALHOST & 127.0.0.1

Так я сделал netstat -a и увидел, что сервер создается следующим образом:

TCP [::]:56283 Sin-Host LISTENING 

вместо

TCP 127.0.0.1:56283 Sin-Host LISTENING 

Таким образом, клиент не может для подключения. Любые идеи о том, как сделать привязку сервера o 127.0.0.1

Какие-либо изменения, которые могут быть сделаны для ServerSocket s1 = new ServerSocket(requestport)?

+1

@ Th0rndike клиента ** это ** запрашивающего один с 'нового сокета («локальный» , requestPort); 'call. Javadoc: _Создает сокет потока и ** подключает его к указанному номеру порта по указанному IP-адресу ** ._ – BackSlash

+0

@BackSlash да, вы правы .. это вызов – rockstar

+0

@BackSlash Да. Комментарий удален :) – Th0rndike

ответ

1

Иногда возникает проблема с localhost и 127.0.0.1
Попробуйте ip в своем клиенте, возможно, это работает.

Просто, чтобы увидеть его легче, чем в комментариях с помощью этого конструктора вы, возможно, можно настроить сервер:

new ServerSocket(1234,10,InetAddress.getByName("127.0.0.1")); 
+0

Будьте осторожны с реальными IP-адресами, так как вам может потребоваться изменить маршрутизатор/модем, чтобы отправить сообщение на внутренний адрес вашей сети. – skiwi

+0

@Sorontur: У меня есть куча, это проблема. Есть ли способ создать сервер на 127.0.0.1. Некоторые варианты для нового сервера ServerSocket (requestport) API для включения имени хоста? – rockstar

+0

@skiwi Этот сервер не будет открыт для внешнего маршрутизатора. Это взаимодействие между сервером и клиентом очень специфично для '' localhost''. Небольшая часть большой картины: D – rockstar

0

Вы пытались проверить свой брандмауэр?

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

+0

Что вы подразумеваете под «он отлично работает здесь»? вы попробовали? Также вероятность того, что эта блокировка будет видна в любых журналах. Имеются ли в протоколе брандмауэра такой отказ? Мне нужно это увидеть. – rockstar

+0

Я имею в виду, что приложение, которое я разрабатываю, имеет точно такие же методы соединения. Блокировка не отображается в журналах, потому что она просто приостанавливает поток, в котором он работает. Проверьте свой брандмауэр, чтобы узнать, есть ли у java доступ в Интернет. – Gelunox

0

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

OutputStream writer = requestsocket.getOutputStream(); 

и

BufferedReader reader = new BufferedReader(new InputStreamReader(requestsocket.getInputStream()); 

сейчас когда вы хотите отправить данные своему клиенту со своего сервера, вы можете сделать что-то вроде этого:

writer.println("Data sending to client that's listening to my server"); 
Смежные вопросы