2014-01-03 6 views
1

Я пытаюсь отправить простую строку между сокетом Java-клиента и гнездом сервера Python. Это код для сокета сервера:Подключение сокета python и java-сокета

HOST='' 
PORT=12000 
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM) 
s.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADRR,1) 
s.bind((HOST,PORT)) 
s.listen(5) 
device=variador() 
while True: 

    conn,addr=s.accept() 
    if data=="turn_on": 
    respuesta=device.send_order(variador.start_order) 
    conn.send(respuesta+'\n') 
    conn.close() 

и клиентский код:

try { 

      Socket socket = new Socket("192.168.10.171", 12000); 

      PrintWriter out = new PrintWriter(socket.getOutputStream(), true); 

      BufferedReader in = new BufferedReader(new InputStreamReader(
             socket.getInputStream()));  

      BufferedReader stdIn = new BufferedReader(
              new InputStreamReader(System.in)); 

      out.print(command); 

      out.close(); 
      in.close(); 
      socket.close(); 

     } catch (UnknownHostException e) { 
      System.err.println("Unknown Host."); 
      // System.exit(1); 
     } catch (IOException e) { 
      System.err.println("Couldn't get I/O for " 
           + "the connection."); 
      // System.exit(1); 
     } 

Все работает хорошо, пока я пытаюсь прочитать ответ сервера, с помощью этого:

String userInput; 
    while ((userInput = stdIn.readLine()) != null) { 
    out.println(userInput); 
    System.out.println("echo: " + in.readLine()); 
    } 

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

Есть ли проблема с попыткой отправить сначала, а затем ждать ответа с сервера на Java-клиенте?

Любая помощь будет очень признательна.

+0

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

+0

Когда клиент java отправляет «turn_on», я могу распечатать его на консоли в python, поэтому он приходит. –

ответ

5

Ну, я обнаружил, что клиент Java зависает, потому что сообщения, отправляемые на сервер питона не были явно закончил с \ г \ п, так что код питон должен был что-то вроде этого:

 HOST='' 
    PORT=12000 
    s=socket.socket(socket.AF_INET,socket.SOCK_STREAM) 
    s.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADRR,1) 
    s.bind((HOST,PORT)) 
    s.listen(5) 
    device=variador() 
    while True: 

     conn,addr=s.accept() 
     if data=="turn_on\r\n": 
     respuesta=device.send_order(variador.start_order) 
     conn.send(respuesta+'\r\n') 
     conn.close() 

I знайте, что это должно было быть совершенно очевидно из названия методов в java, readline() и println, оба предполагая, что java заканчивает строки с последовательностью \ r \ n

0

Если вы хотите отправить только одну команду на затем закройте OutputStream после написания команды (используя Socket.shutdownOutput()). Сокет читается до EOF, и вы не получите EOF, пока не закроете гнездо. следовательно, ваш код никогда не будет продолжаться.

Источник - java socket InputStream hangs/blocks on both client and server

Надежда это помогает!

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