求SOCKET编程同步收发数据好的解决办法?

时间:2021-01-23 14:48:21
小弟初涉SOCKET遍程序,现在任务要求,服务器端处于监听,由客户端请求连接,连接成功后收发数据.断开连接由客户端提出,服务器响应断开请求,之后又自动进入监听状态,如果客户端再次请求连接,又重新连接收发数据.意思就是所有连接和断开的操作均有客户端提出,服务器只负责一直监听,有连接时就响应.

断开连接,很多书上都采用讲有客户端发一个特定的数据,服务器收到数据判断是否需要关闭连接.我的问题是,这个数服务器收到关闭连接后,客户端也会因连接异常断开.如何让客户端不会出现异常断开错误,而服务器断开后又自动进入监听状态.

我的代码,大家帮我看看:

服务器端:
Thread tcp_thread=new Thread(new ThreadStart(targett));//监听线程
tcp_thread.Start();
private void targett()
        {

            try
            {
                MyServer = new IPEndPoint(myIP, Int32.Parse(form_ip.ip_com));
                sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            }
            catch (Exception e)
            {
                MessageBox.Show(e.ToString());
            }
          
            try
            {
                sock.Bind(MyServer);

                sock.Listen(50);
                aaa = sock.Accept();
            }
            catch (Exception e)
            {
                MessageBox.Show(e.ToString());
            }

          
            if (aaa.Connected)
            {
                label2.Text = "Socket建立连接。";


                while (tcp_flag)
                {
                    byte[] bbb = new byte[10];
                    int i;
                    i = aaa.Receive(bbb, bbb.Length, 0);


                    Encoding enc = Encoding.UTF8;
                    string ccc = enc.GetString(bbb, 0, i);

                    textBox1.Text += ccc;
                    if (ccc == "000")//如果收到客户端发送000,关闭连接
                    {
                        aaa.Close();//关闭连接(问题出在,此时候关闭了连接,客户端就会有异常关闭连接的报错)
                        tcp_flag = false;
                        label2.Text = "远程主机已关闭连接。";
                    }
                    else
                    {
                        flag = ccc;
                       // judge();
                    }
                    
                }

            }
        }


客户端发出关闭连接的特定字符串,发出后,服务器响应关闭操作,客户端如何才能不出异常关闭连接错误,服务器关闭连接后,又自动进入监听状态,等待客户端再次发出连接请求.
还有就是问问大家SOCKET编程同步收发和异步收发再概念上的区别.我看就是,同步就是SEND\RECEIVE,异步就是BEGINSEND\BEGINRECEIVE.

10 个解决方案

#1


就是在客户端发送了关闭的请求后,客户端就要关闭连接(如果不需要服务器确认的话)。要不然就是会报错的。

#2


就算客户端发出关闭请求后,也紧跟写关闭连接的代码,那么服务器又怎么自动进入监听状态呢?

#3


怎么没人给答案

#4


引用 2 楼 WITPIDAN 的回复:
就算客户端发出关闭请求后,也紧跟写关闭连接的代码,那么服务器又怎么自动进入监听状态呢?

服务端先把Socket关掉,然后再进行监听不就可以了?

#5


服务端先把Socket关掉,然后再进行监听.我调试始终报“通常套接字使用只允许一次”。如何才能正常进入继续监听,客户端发送连接请求又再次重新连接?

#6


服务端不需要关闭连接,因为服务端提供的是对全部客户端的监听,如果服务端关闭连接的同时,其他客户端发送的请求就无法接收,断开只是单方面的,客户端断开即可。

#7


同意楼上的~ 断开连接的话,直接让客户端断掉就可以了

#8


在客户端发送特殊断开子令(000)之后,完成socket与服务器的子令交互后,再去主动断开客户端。

#9


private void targett() 
        { 

            try 
            { 
                MyServer = new IPEndPoint(myIP, Int32.Parse(form_ip.ip_com)); 
                sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
            } 
            catch (Exception e) 
            { 
                MessageBox.Show(e.ToString()); 
            } 
           
            try 
            { 
                sock.Bind(MyServer); 

                sock.Listen(50); 
                aaa = sock.Accept(); 
            } 
            catch (Exception e) 
            { 
                MessageBox.Show(e.ToString()); 
            } 

           while(true)
{
            if (aaa.Connected) 
            { 
                label2.Text = "Socket建立连接。"; 


                while (tcp_flag) 
                { 
                    byte[] bbb = new byte[10]; 
                    int i; 
                    i = aaa.Receive(bbb, bbb.Length, 0); 


                    Encoding enc = Encoding.UTF8; 
                    string ccc = enc.GetString(bbb, 0, i); 

                    textBox1.Text += ccc; 
                    if (ccc == "000")//如果收到客户端发送000,关闭连接 
                    { 
                        aaa.Close();//关闭连接(问题出在,此时候关闭了连接,客户端就会有异常关闭连接的报错) 
                        tcp_flag = false; 
                        label2.Text = "远程主机已关闭连接。"; 
                    } 
                    else 
                    { 
                        flag = ccc; 
                       // judge(); 
                    } 
                     
                } 

            }

        } 

#10


友情UP

#1


就是在客户端发送了关闭的请求后,客户端就要关闭连接(如果不需要服务器确认的话)。要不然就是会报错的。

#2


就算客户端发出关闭请求后,也紧跟写关闭连接的代码,那么服务器又怎么自动进入监听状态呢?

#3


怎么没人给答案

#4


引用 2 楼 WITPIDAN 的回复:
就算客户端发出关闭请求后,也紧跟写关闭连接的代码,那么服务器又怎么自动进入监听状态呢?

服务端先把Socket关掉,然后再进行监听不就可以了?

#5


服务端先把Socket关掉,然后再进行监听.我调试始终报“通常套接字使用只允许一次”。如何才能正常进入继续监听,客户端发送连接请求又再次重新连接?

#6


服务端不需要关闭连接,因为服务端提供的是对全部客户端的监听,如果服务端关闭连接的同时,其他客户端发送的请求就无法接收,断开只是单方面的,客户端断开即可。

#7


同意楼上的~ 断开连接的话,直接让客户端断掉就可以了

#8


在客户端发送特殊断开子令(000)之后,完成socket与服务器的子令交互后,再去主动断开客户端。

#9


private void targett() 
        { 

            try 
            { 
                MyServer = new IPEndPoint(myIP, Int32.Parse(form_ip.ip_com)); 
                sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
            } 
            catch (Exception e) 
            { 
                MessageBox.Show(e.ToString()); 
            } 
           
            try 
            { 
                sock.Bind(MyServer); 

                sock.Listen(50); 
                aaa = sock.Accept(); 
            } 
            catch (Exception e) 
            { 
                MessageBox.Show(e.ToString()); 
            } 

           while(true)
{
            if (aaa.Connected) 
            { 
                label2.Text = "Socket建立连接。"; 


                while (tcp_flag) 
                { 
                    byte[] bbb = new byte[10]; 
                    int i; 
                    i = aaa.Receive(bbb, bbb.Length, 0); 


                    Encoding enc = Encoding.UTF8; 
                    string ccc = enc.GetString(bbb, 0, i); 

                    textBox1.Text += ccc; 
                    if (ccc == "000")//如果收到客户端发送000,关闭连接 
                    { 
                        aaa.Close();//关闭连接(问题出在,此时候关闭了连接,客户端就会有异常关闭连接的报错) 
                        tcp_flag = false; 
                        label2.Text = "远程主机已关闭连接。"; 
                    } 
                    else 
                    { 
                        flag = ccc; 
                       // judge(); 
                    } 
                     
                } 

            }

        } 

#10


友情UP