首先使用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);
如果不加sokClient.Available > 0判断直接使用Receive方法则会出现线程阻塞的情况(不知是否是这个解决方案,但我是加上这个判断问题就解决了);ShowMsgForm(strMsg); } }
另外值得一说的是Socket线程在不断的进行Receive请求时(即在while循环中);在其中new 窗体显示的时候,这个窗体是不会被显示出来的,原因是该线程占用cpu一直处理Receive请求,无法去渲染窗体出来,处理办法就是调用Application.DoEvents()方法对齐暂时释放cpu渲染窗体(自己的理解);