通过Wifi进行数据传输时,打开的文件过多

时间:2018-04-12 13:10:29

标签: c# winforms xamarin.android

我有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);
    }

所以我的问题是,是什么导致了这个问题,我该如何解决?

1 个答案:

答案 0 :(得分:0)

您的问题如下:为ProgressChanged事件处理程序的每次调用打开一个套接字。你可以在一台机器上打开limited个套接字,如果你打开它们的速度足够快,你最终会进入System.Net.Sockets.SocketException

解决此问题的方法是确保关闭TCP连接gracefully。这样,您将释放套接字以供进一步使用。

我认为TCP对于这种通信来说有点矫枉过正。您可以使用HTTP传输数据。您的桌面应用程序将是服务器,Xamarin应用程序将成为客户端。通过这种方式,您将被同步,连接状态等所释放。

相关问题