Sockets java(或python)服务器有时不接收TCP数据

Sockets java(或python)服务器有时不接收TCP数据,sockets,networking,tcp,arduino,wifi,Sockets,Networking,Tcp,Arduino,Wifi,我正在开发一个由arduino mkr1000组成的系统,我想通过wifi将数据发送到本地网络中运行的java服务器程序 除主要部分外,所有功能都正常工作:服务器有时无法接收arduino发送的数据 我正在使用连接到我的wifi,获取WiFiClient并发送数据。 下面的代码只是一个示例来演示该问题: for(int i=0;i

我正在开发一个由arduino mkr1000组成的系统,我想通过wifi将数据发送到本地网络中运行的java服务器程序

除主要部分外,所有功能都正常工作:服务器有时无法接收arduino发送的数据

我正在使用连接到我的wifi,获取
WiFiClient
并发送数据。 下面的代码只是一个示例来演示该问题:

for(int i=0;i<3;++i){
Serial.println(F(“连接到wifi”);
const auto status=WiFi.begin(“…”,“…”);
如果(状态!=WL\U已连接){
串行打印(F(“无法连接到WiFi:”);
开关(状态){
案例WL\U连接\U失败:
Serial.println(F(“WL_连接失败”);
打破
案例WLU断开:
串行打印LN(F(“WL_断开”);
打破
违约:
连续打印(F(“代码”);
串行打印LN(状态,DEC);
打破
}
}否则{
Serial.println(F(“WiFi状态:WL_已连接”);
无线客户端;
if(client.connect(“192.168.0.102”,1234)){
延迟(500);
客户。打印(F(“测试”);
委托人:println(一,十二月);
client.flush();
Serial.println(F(“写入的数据”);
延迟(5000);
client.stop();
}否则{
Serial.println(F(“无法连接”);
}
WiFi.end();
}
延迟(2000年);
}
java服务器基于,但与手动创建和读取
Socket
产生的结果相同。 测试代码非常标准,只有一个简单的输出(注意:在Kotlin中):

val bossGroup=NioEventLoopGroup(1)
val workerGroup=NioEventLoopGroup(6)
val serverFuture=ServerBootstrap()。运行{
组(bossGroup、workerGroup)
通道(NioServerSocketChannel::class.java)
childHandler(对象:ChannelInitializer(){
覆盖通道(ch:NioSocketChannel){
ch.管道()
.addLast(LineBasedFrameDecoder(Int.MAX_值))
.addLast(StringDecoder())
.addLast(对象:ChannelInboundHandlerAdapter(){
覆盖趣味channelRead(ctx:ChannelHandlerContext,msg:Any){
println(“msg=$msg”)
ctx.close()
}
})
}
})
绑定(端口).sync()
}
arduino告诉我们一切正常(即为每次迭代向串行控制台写入
数据),但服务器有时会跳过单个消息。
在这些情况下,从Netty添加
LoggingHandler
告诉我:

11:28:48.576 [nioEventLoopGroup-3-1] WARN  i.n.handler.logging.LoggingHandler - [id: 0x9991c251, L:/192.168.0.20:1234 - R:/192.168.0.105:63845] REGISTERED
11:28:48.577 [nioEventLoopGroup-3-1] WARN  i.n.handler.logging.LoggingHandler - [id: 0x9991c251, L:/192.168.0.20:1234 - R:/192.168.0.105:63845] ACTIVE
在收到消息的情况下,它会告诉我:

11:30:01.392 [nioEventLoopGroup-3-6] WARN  i.n.handler.logging.LoggingHandler - [id: 0xd51b7bc3, L:/192.168.0.20:1234 - R:/192.168.0.105:59927] REGISTERED
11:30:01.394 [nioEventLoopGroup-3-6] WARN  i.n.handler.logging.LoggingHandler - [id: 0xd51b7bc3, L:/192.168.0.20:1234 - R:/192.168.0.105:59927] ACTIVE
11:30:01.439 [nioEventLoopGroup-3-6] WARN  i.n.handler.logging.LoggingHandler - [id: 0xd51b7bc3, L:/192.168.0.20:1234 - R:/192.168.0.105:59927] READ: 8B
         +-------------------------------------------------+
         |  0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f |
+--------+-------------------------------------------------+----------------+
|00000000| 54 65 73 74 20 32 0d 0a                         |Test 2..        |
+--------+-------------------------------------------------+----------------+
11:30:01.449 [nioEventLoopGroup-3-6] WARN  i.n.handler.logging.LoggingHandler - [id: 0xd51b7bc3, L:/192.168.0.20:1234 - R:/192.168.0.105:59927] CLOSE
11:30:01.451 [nioEventLoopGroup-3-6] WARN  i.n.handler.logging.LoggingHandler - [id: 0xd51b7bc3, L:/192.168.0.20:1234 ! R:/192.168.0.105:59927] READ COMPLETE
11:30:01.453 [nioEventLoopGroup-3-6] WARN  i.n.handler.logging.LoggingHandler - [id: 0xd51b7bc3, L:/192.168.0.20:1234 ! R:/192.168.0.105:59927] INACTIVE
11:30:01.464 [nioEventLoopGroup-3-6] WARN  i.n.handler.logging.LoggingHandler - [id: 0xd51b7bc3, L:/192.168.0.20:1234 ! R:/192.168.0.105:59927] UNREGISTERED
据我所知,这意味着TCP数据包确实已被接收,但在出现故障的情况下,来自Netty的IO线程正在等待读取TCP数据,但从未继续。。。 在尝试使用基本的python服务器时(只是等待连接并打印接收到的数据),也存在同样的问题

我确认数据是通过在Arch Linux上使用参数
-I any-C-g port 1234
发送的。 我甚至在Windows7机器上尝试了该服务器,结果都是一样的(TCP数据包已确认)

奇怪的是,使用java服务器发送数据总是可以重复接收

有没有人知道如何解决这个问题,或者至少如何诊断

PS:可能需要注意的是,使用
tcpflow
(即在linux上),我可以看到TCP数据包被重新发送到服务器。 这是否意味着服务器正在接收数据包,但没有发送ACK?
SmartSniff没有显示相同的行为(但可能是我使用了错误的选项来显示重新发送的数据包)。

与此同时,我发送消息以确认收到另一条消息。如果未收到确认,则再次发送消息


对于有相同问题的任何人:

在测试不同的东西时,我将线路板的wifi固件更新为最新版本
19.5.2
。从那以后,我没有注意到任何丢失的数据。也许这就是问题所在。 见和。 注意:我无法使用Arduino IDE运行草图,但是使用了