Как общаться между Java и Dart через Socket - PullRequest
0 голосов
/ 31 января 2020

Я хотел бы запустить комбинацию кода Dart и Java, которые могут взаимодействовать друг с другом. Поэтому я выбрал go с сокетами, с сокетом сервера, записанным в Java, и сокетом клиента, написанным в Dart.

Это код, который я написал:

Сервер

ServerSocket server = new ServerSocket(12345);
server.setSoTimeout(0);        
System.out.println("waiting for connection...");

while (true) {
    try {
        Socket client = socket.accept();
        DataInputStream input = new DataInputStream(client.getInputStream());
        DataOutputStream output = new DataOutputStream(client.getOutputStream());
        System.out.println("connected to " + client.getLocalSocketAddress() + ".");

        while (true) {
            output.write(input.readLine());
        }
    } catch (IOException e) {
        System.out.println("disconnected.\n\nwaiting for connection...");
    }
}

Клиент

Socket client = await Socket.connect('localhost', 12345);
client.write('hello there\n');
client.close();

К сожалению, сервер не получает сообщение ping, отправленное клиентом. Теперь я предполагаю, что проблема заключается в коде Dart, потому что при выполнении клиента, написанного в Java, все работало нормально.

Знаете ли вы, как решить эту проблему? Если так, пожалуйста, дайте мне знать, хо. Заранее благодарим!


Обратите внимание:

Поскольку одновременно никогда не будет более одного клиента, я выбрал go с таким подходом. Я знаю, что обычно это не очень хороший стиль.

Ответы [ 2 ]

0 голосов
/ 01 февраля 2020

Не знаю почему, но похоже, что проблема заключается в DataInputStream / DataOutputStream.

Вот что сработало:

Сервер

ServerSocket server = new ServerSocket(12345);
server.setSoTimeout(0);        
System.out.println("waiting for connection...");

while (true) {
    try {
        Socket client = socket.accept();
        BufferedWriter output = BufferedWriter(new OutputStreamWriter(client.getOutputStream()));
        BufferedReader input = new BufferedReader(new InputStreamReader(client.getInputStream()));
        System.out.println("connected to " + client.getLocalSocketAddress() + ".");

        while (true) {
            output.writeUTF(input.readUTF());
        }
    } catch (IOException e) {
        System.out.println("disconnected.\n\nwaiting for connection...");
    }
}

Клиент

Socket client = await Socket.connect('localhost', 12345);
client.write('hello there\n');
client.close();
0 голосов
/ 31 января 2020

В документации по close() для класса Socket:

ПРИМЕЧАНИЕ. Записи в IOSink могут быть буферизованы и не могут быть сброшены вызовом close (). Чтобы flu sh все буферизованные записи, вызовите flu sh () перед вызовом close ().

https://api.dart.dev/stable/2.7.1/dart-io/Socket/close.html

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