我有一个与条形码扫描仪配对的android设备。该设备的设置是,每次扫描仪读取条形码时,都会使用广播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表示有很多套接字处于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个错误,因此我认为拒绝连接被返回。我想说客户端和服务器套接字都正确关闭了,但是一定有问题。
这是怎么了?意图上的套接字连接是否应在android上以不同的方式处理?我应该以其他方式关闭插座还是设置一些选项?
在客户端,您需要处置/关闭套接字:
using (TcpClient client = new TcpClient(ip, port))
在服务器端,客户端套接字也是如此:
using (var client = await _server.AcceptTcpClientAsync())
这里有比赛条件。当双方都试图在同一时间关闭另一端时,插座将永远挂在CLOSE_WAIT中。
将服务器更改为:
var client = await _server.AcceptTcpClientAsync();
不使用
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句