我有一个与条形码扫描仪配对的安卓设备。该设备设置为每次扫描仪读取条形码时都会使用广播 Intent,我的应用程序会捕获数据,向其中添加一些信息,打开一个连接到服务器的套接字并发送数据。
[BroadcastReceiver(Enabled = true)]
public class FingerScannerReceiver : BroadcastReceiver
{
public override void OnReceive(Context context, Intent intent)
{
using (TcpClient client = new TcpClient(ip, port))
{
NetworkStream stream = client.GetStream();
var b = Encoding.ASCII.GetBytes(decodedData);
stream.Write(b, 0, b.Length);
}
}
}
该应用程序还有一个在端口 3333 上运行的 TCP 监听器。服务器检索数据并打开到端口 3333 的套接字并将信息发回。
服务器的 TcpListener 代码:
while (_isServerWorking)
{
using (var client = await _server.AcceptTcpClientAsync())
{
string data = "";
NetworkStream stream = client.GetStream();
byte[] bytes = new byte[32267];
int n;
while ((n = stream.Read(bytes, 0, bytes.Length)) > 0)
data += Encoding.ASCII.GetString(bytes, 0, n);
OnServerConnected(args);
}
}
这通常工作正常,但每天一两次设备无法再连接,返回连接被拒绝的套接字错误。服务器端netstat说有不少socket处于CLOSE_WAIT状态
TCP 172.17.0.85:58627 192.168.30.28:41682 CLOSE_WAIT
TCP 172.17.0.85:58627 192.168.30.28:41684 CLOSE_WAIT
TCP 172.17.0.85:58627 192.168.30.28:41686 CLOSE_WAIT
总共有 187 个错误,我认为因此返回拒绝的连接。我会说客户端和服务器套接字都正确关闭,但一定有问题。
这里出了什么问题? Intent 中的套接字连接是否应该在 android 上以不同方式处理?
我应该以不同的方式关闭套接字还是设置一些选项?
最佳答案
在客户端,您处理/关闭套接字:
using (TcpClient client = new TcpClient(ip, port))
在服务器端,客户端套接字也是如此:using (var client = await _server.AcceptTcpClientAsync())
这里有一个竞争条件。当两者试图在完全相同的时间关闭另一端时,套接字将永远卡在 CLOSE_WAIT 中。将服务器更改为:
var client = await _server.AcceptTcpClientAsync();
没有使用
关于c# - android设备上的套接字连接拒绝错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65121430/