Socket遇到的问题

来源:互联网 发布:视频会议矩阵用途 编辑:程序博客网 时间:2024/04/28 11:34

首先使用Socket的Receive方法:

socket在直接使用receive方法接收数据时时会遇到线程被阻塞的情况:

如:

        public void ConnectionServer()        {                        sokClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);            //创建 ip对象            IPAddress address = IPAddress.Parse("192.168.1.77");            //创建网络节点对象 包含 ip和port            IPEndPoint endpoint = new IPEndPoint(address, 1900);            //连接 服务端监听套接字            sokClient.Connect(endpoint);            //创建负责接收 服务端发送来数据的 线程            threadClient = new Thread(ReceiveMsg);            threadClient.IsBackground = true;            //如果在win7下要通过 某个线程 来调用 文件选择框的代码,就需要设置如下            threadClient.SetApartmentState(ApartmentState.STA);            threadClient.Start();        }        void ReceiveMsg()        {            while (isRec)            {                Application.DoEvents();                byte[] msgArr = new byte[1024 * 1024 * 1];//接收到的消息的缓冲区                int length = 0;                //接收服务端发送来的消息数据                if (sokClient.Available > 0)//判断是否接收到信息                {                    length = sokClient.Receive(msgArr);//Receive会阻断线程                }                else                {                    continue;                }                string strMsg = System.Text.Encoding.UTF8.GetString(msgArr);
                ShowMsgForm(strMsg);            }        }

如果不加sokClient.Available > 0判断直接使用Receive方法则会出现线程阻塞的情况(不知是否是这个解决方案,但我是加上这个判断问题就解决了);

另外值得一说的是Socket线程在不断的进行Receive请求时(即在while循环中);在其中new 窗体显示的时候,这个窗体是不会被显示出来的,原因是该线程占用cpu一直处理Receive请求,无法去渲染窗体出来,处理办法就是调用Application.DoEvents()方法对齐暂时释放cpu渲染窗体(自己的理解);



	
				
		
原创粉丝点击