首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

关于socket异步通信,该怎么解决

2013-07-04 
关于socket异步通信我写了一个客户端和服务端,客户端只发送不接受,服务端只接受不发送,客户端采用异步连接

关于socket异步通信
我写了一个客户端和服务端,客户端只发送不接受,服务端只接受不发送,
客户端采用异步连接和异步发送,客户端每次发送都要新建连接,服务端采用异步接收连接和异步发送,
我想实现的是客户端新建一个连接socket,发送过去消息,服务端接收到消息后就立即关闭此socket,
可是采用了异步后,怎么才能关闭socket呢
服务端代码

        //监听函数                 
        public void Listen()
        {
            //设置端口                          
            setPort = int.Parse(serverport.Text.Trim());
            //设置IP
            IPAddress ip = IPAddress.Parse(serverIP.Text.Trim());
            //初始化Socket实例                          
            newsock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

            //初始化终结点实例                          
            localEP = new IPEndPoint(ip, setPort);
            try
            {
                //绑定                                  
                newsock.Bind(localEP);
                //监听                                  
                newsock.Listen(50);//挂起连接队列的最大长度,根据操作系统而定

                //开始接受连接,异步。                                  
                //newsock.BeginAccept(new AsyncCallback(OnConnectRequest), newsock);
                while (true)
                {
                    allDone.Reset();
                    //异步接收连接
                    newsock.BeginAccept(new AsyncCallback(OnConnectRequest), newsock);


                    allDone.WaitOne();
                }
            }
            catch (Exception ex)
            {
                showClientMsg("连接错误:" + ex.Message);
            }


        public void OnConnectRequest(IAsyncResult ar)
        {
            try
            {
                allDone.Set();
                Socket listener = (Socket)ar.AsyncState;
                Socket handler = listener.EndAccept(ar);
                //异步接收数据
                handler.BeginReceive(result, 0, result.Length, 0, new AsyncCallback(ReadCallback), handler);
            }
            catch (Exception ex)
            {
                showClientMsg("接收数据错误:" + ex.Message);

            }
        }
        public void ReadCallback(IAsyncResult ar)
        {
            try
            {
                Socket handler = (Socket)ar.AsyncState;
                int bytesRead = handler.EndReceive(ar);
                {
                    string stringdata = Encoding.ASCII.GetString(result, 0, bytesRead);
                    string ip = handler.RemoteEndPoint.ToString();
                    //反序列化
                    MemoryStream ms = new MemoryStream(result);
                    //移动到头部
                    ms.Position = 0;


                    BinaryFormatter formatter = new BinaryFormatter();
                    Model.UploadEntities.AllEntities enti = formatter.Deserialize(ms) as Model.UploadEntities.AllEntities;
                    DateTimeOffset now = DateTimeOffset.Now;

                    //显示客户端发送过来的信息
                    if (enti.MyCheckLevelData != null)
                    {
                        showClientMsg(ip + "    油罐名称:" + enti.MyCheckLevelData.StorehouseName + "   液位:" + enti.MyCheckLevelData.Leval.ToString() + "\r\n");
                    }
                    else if (enti.MyCheckFlowData != null)
                    {
                        showClientMsg(ip + "    油罐名称:" + enti.MyCheckFlowData.StorehouseName + "   流量:" + enti.MyCheckFlowData.Flow.ToString() + "\r\n");
                    }
                    else if (enti.MyCheckTData != null)
                    {
                        showClientMsg(ip + "    油罐名称:" + enti.MyCheckTData.StorehouseName + "   平均温:" + enti.MyCheckTData.AT.ToString() + "\r\n");
                    }
     //上面等于说是服务端接收到数据了,然后我想在这里关闭socket,下面这两句话不知道能关闭么???求大神知道啊!!!
                    handler.Shutdown(SocketShutdown.Both);
                    handler.Close();
                }

            }
            catch (Exception ex)
            {
                showClientMsg("错误:" + ex.Message);


            }
        }



 不会

热点排行