TCP-сокет с Python-сервером и Java-клиентом - PullRequest
0 голосов
/ 10 января 2019

Я пытаюсь обмениваться некоторыми строковыми данными между сервером Python (в идеале, Raspberry Pi с некоторым устройством, подключенным через GPIO) и клиентом Java (опять же, основной целью будет приложение для Android). В любом случае следующий код выполняется на стандартном локальном ПК.

Это код сервера, взятый (и слегка измененный) из здесь :

import socketserver
import datetime

class MyTCPHandler(socketserver.StreamRequestHandler):

    def handle(self):
        now = datetime.datetime.now()
        answer = now
        self.data = self.rfile.readline().strip()
        print("Read!")
        if str(self.data) == 'date':
            answer = now.date()
        elif str(self.data) == 'time':
            answer = now.time()

        self.wfile.write((str(answer)+"\n").encode('utf-8'))
        print("Sent!")

if __name__ == "__main__":
    HOST, PORT = "localhost", 9999
    with socketserver.TCPServer((HOST, PORT), MyTCPHandler) as server:
        print("Server is running on {}, port {}".format(HOST, PORT))
        server.serve_forever()

Клиент Java имеет следующий вид:

public class SocketTest {
    public static void main(String[] args) {
        try {
            Socket s = new Socket("127.0.0.1", 9999);
            PrintWriter out = new PrintWriter(new OutputStreamWriter(s.getOutputStream()));
            BufferedReader in = new BufferedReader(new InputStreamReader(s.getInputStream()));

            out.println("date".getBytes());
            String resp = in.readLine();
            System.out.println("Received: " + resp);

        } catch (IOException ex) {
            Logger.getLogger(SocketTest.class.getName()).log(Level.SEVERE, null, ex);
        }
    }   
}

Никаких исключений не выдается, оно просто застревает в ожидании ответа на стороне клиента, и я никогда не вижу сообщения "Read!" на стороне сервера.

"date".getBytes() откуда-то из сети, где я обнаружил, что сокеты Python ожидают байты (UTF-8), но в Java я посылаю строки напрямую, поэтому это может быть неправильно.

Любая помощь будет оценена!

1 Ответ

0 голосов
/ 11 января 2019

Оказывается, это была проблема с промывкой.

Очевидно, что буфер не очищается при достижении конца строки (именно так я и ожидал).

Добавление простого out.flush() решило проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...