首先使用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渲染窗体(自己的理解);