我有2个应用程序:Xamarin.Android
客户端应用程序通过Wifi和SeekBar
服务器从WinForms
发送值,实时接收此值。一切都运行良好,但每次大约40秒的数据传输后,Android应用程序会抛出System.Net.Sockets.SocketException
消息“打开太多文件”。
我的服务器代码接收数据:
public void StartReceiving()
{
IPAddress localAdd = IPAddress.Parse(SERVER_IP);
TcpListener listener = new TcpListener(localAdd, PORT_NO);
listener.Start();
while (true)
{
Socket client = listener.AcceptSocket();
client.NoDelay = true;
var childSocketThread = new Thread( () =>
{
byte[] datareceived = new byte[1];
int size = client.Receive(datareceived);
for (int i = 0; i < size; i++)
{
Console.WriteLine(datareceived[0].ToString());
}
Console.WriteLine();
//client.Close();
});
childSocketThread.Start();
}
}
从SeekBar发送值的客户端代码:
private void Seek1_ProgressChanged(object sender, SeekBar.ProgressChangedEventArgs e)
{
TcpClient client = new TcpClient(SERVER_IP, PORT_NO);
NetworkStream nwStream = client.GetStream();
byte[] bytesToSend = new byte[1];
bytesToSend[0] = Convert.ToByte(e.Progress);
nwStream.Write(bytesToSend, 0, bytesToSend.Length);
}
所以我的问题是,是什么导致了这个问题,我该如何解决?
答案 0 :(得分:0)
您的问题如下:为ProgressChanged事件处理程序的每次调用打开一个套接字。你可以在一台机器上打开limited个套接字,如果你打开它们的速度足够快,你最终会进入System.Net.Sockets.SocketException
。
解决此问题的方法是确保关闭TCP连接gracefully。这样,您将释放套接字以供进一步使用。
我认为TCP对于这种通信来说有点矫枉过正。您可以使用HTTP传输数据。您的桌面应用程序将是服务器,Xamarin应用程序将成为客户端。通过这种方式,您将被同步,连接状态等所释放。