如何从Dartlang套接字连接到Java套接字

如何从Dartlang套接字连接到Java套接字,java,tcp,dart,Java,Tcp,Dart,我有一个用java编写的TCP服务器。我试图通过用dartlang编写的TCP客户端套接字连接到它,但用dartlang编写的客户端几乎在初始连接后立即超时(我在java代码中设置的5秒超时)。在dart客户端连接后,我可以在测试中立即向它发送消息,但很快它就超时了。但是,服务器从未接收到dartlang'{“packet\u id:1}'中的数据 我尝试用dartlang编写一个测试服务器,它能够连接和发送/接收消息,没有任何问题 Dart客户端: import 'dart:io'; impo

我有一个用java编写的TCP服务器。我试图通过用dartlang编写的TCP客户端套接字连接到它,但用dartlang编写的客户端几乎在初始连接后立即超时(我在java代码中设置的5秒超时)。在dart客户端连接后,我可以在测试中立即向它发送消息,但很快它就超时了。但是,服务器从未接收到dartlang
'{“packet\u id:1}'
中的数据

我尝试用dartlang编写一个测试服务器,它能够连接和发送/接收消息,没有任何问题

Dart客户端:

import 'dart:io';
import 'dart:async';

main(List<String> arguments) {


  Future<Socket> future = Socket.connect('localhost', 12345);
  future.then((client) {
    print('connected to server!');
    client.handleError((data){
      print(data);
    });
    client.listen(
            (data) {
              print(new String.fromCharCodes(data));
            },
            onDone:(){
              print("Done");},
            onError: (error) {
              print(error);
            }
          );
    String requestHalls = '{"packet_id":1}';
    client.write(requestHalls);
  }).catchError(() {print('Error connecting');});
  print('Hello world: ${dart_test.calculate()}!');
}
服务器“客户端”HDA连接类:

protected Socket socket;
protected DataInputStream inputStream;
protected DataOutputStream outputStream;
private boolean shutdown = false;

public HDAConnection(Socket socket) {
    this.socket = socket;

    // configure socket
    try {
        socket.setKeepAlive(true);
        socket.setSoTimeout(5000);
        socket.setTcpNoDelay(true);
    } catch (SocketException ex) {
        AbstractHDALogger.get().severe("Error configuring Socket Connection.", ex);
    }

    // create input/output stream for handling data
    try {
        inputStream = new DataInputStream(socket.getInputStream());
        outputStream = new DataOutputStream(socket.getOutputStream());
    } catch (IOException ex) {
        AbstractHDALogger.get().severe("Error creating input/output streams.", ex);
    }
}
正在流上侦听消息的代码

String response = null;
try {
    response = new BufferedReader(new InputStreamReader(inputStream)).readLine();
} catch(SocketTimeoutException ste) {
    shutdown();
    AbstractHDALogger.get().severe(String.format("Socket Timed out(%s), closing Connection", this.getRemoteIP()), ste);
    // TODO: handle exception
} catch (IOException e) {
    // TODO Make this better?
    // IO Exception probably means client disconnected, so we should terminate.
    if (e.getMessage().equals("Connection reset")) {
        shutdown();
        AbstractHDALogger.get().info(String.format("Client Connection Disconnected(%s). Closing connection.", this.getRemoteIP()));
    } else {
        shutdown();
        AbstractHDALogger.get().severe(String.format("Connection Error(%s), closing Connection", this.getRemoteIP()), e);
    }   
    return null;
}

Java服务器上的套接字超时,因为dartlang客户端从未在其消息末尾写入换行符,Java服务器正在使用该方法读取。此函数仅在读取新行字符时返回。从dartlang客户端读取初始消息后,Java服务器等待5秒钟,等待发送更多数据,但由于不再发送任何数据,因此将超时


dartlang客户端应使用函数或在其消息末尾添加换行符,以便Java server BufferedReader返回。

以及您的Java服务器代码?如果Java客户端“正常”连接到Java服务器,但dartlang客户端没有,则说明dartlang客户端存在配置问题,主机名或端口错误。另一个要考虑的是客户端是否确实连接,然后在连接之后挂起代码。你查过了吗?没有。这里没有Java服务器代码。Java服务器将创建一个
ServerSocket
ServerSocketChannel
,并调用
accept()
。注意:您不应该为每条消息创建一个新的
BufferedReader
,您也不需要它和一个
DataInputStream
:在任何情况下,它们都不会一起工作。我用ServerSocket类更新了它,以作为创建与客户端的套接字类连接的参考。无论如何,我找到了问题所在,并给出了答案。谢谢。@Ayron_Imao我也遇到了类似的错误。从Dart关闭java服务器连接的最佳方式是什么?在我的Dart代码中,我还使用\n。但我一直在通过对等errno 104 SocketException重置错误连接。我可以第一次获取数据,如果我尝试第二次获取数据,我会得到这个错误。如果我再等待一段时间并尝试获取,我会得到上面错误的数据
String response = null;
try {
    response = new BufferedReader(new InputStreamReader(inputStream)).readLine();
} catch(SocketTimeoutException ste) {
    shutdown();
    AbstractHDALogger.get().severe(String.format("Socket Timed out(%s), closing Connection", this.getRemoteIP()), ste);
    // TODO: handle exception
} catch (IOException e) {
    // TODO Make this better?
    // IO Exception probably means client disconnected, so we should terminate.
    if (e.getMessage().equals("Connection reset")) {
        shutdown();
        AbstractHDALogger.get().info(String.format("Client Connection Disconnected(%s). Closing connection.", this.getRemoteIP()));
    } else {
        shutdown();
        AbstractHDALogger.get().severe(String.format("Connection Error(%s), closing Connection", this.getRemoteIP()), e);
    }   
    return null;
}