如何从Dartlang套接字连接到Java套接字
我有一个用java编写的TCP服务器。我试图通过用dartlang编写的TCP客户端套接字连接到它,但用dartlang编写的客户端几乎在初始连接后立即超时(我在java代码中设置的5秒超时)。在dart客户端连接后,我可以在测试中立即向它发送消息,但很快它就超时了。但是,服务器从未接收到dartlang如何从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
'{“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;
}