服务器与客户端通信(服务器)
//先取消跨线程访问检查
private void Form1_Load(object sender,EventArgs e)
{
Control.CheckForIllegalCrossThreadCalls=false;
}
private void btnStart_Click(object sender,EventArgs e)
{
try{
//当点击开始监听的时候,在服务器端创建一个负责监IP地址跟端口号的Socket
Socket socketWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPAddress ip=IPAddress.Any;//IPAddress.Parse(txtServer.Text);
//创建端口号对象
IPEndPoint point=new IPEndPoint(ip,Convert.ToInt32(txtPort.Text));
//监听
socketWatch.Bind(point);
ShowMsg("坚挺成功");
socketWatch.Listen(10);//一个时间点内容量10个人,第11个排队
//等待客户端的链接:主线程中执行,等待会造成假死
Socket socketSend =socketWatch.Accept();
ShowMsg(socketSend.RemoteEndPoint.Tostring()+":"+"链接成功");
//在新线程中执行,不会造成假死
Thread th=new Thread(Listen);
th.IsBackground=true;
th.Start(socketWatch);
}
catch{}
}
//等待客户端的链接,并且创建与之通信用的Socket 用线程执行调用
//用新开的线程调用listen,防止卡死
void Listen(object o)
{
Socket socketWatch=o as Socket;
while(true)
{
try{
Socket socketSend=socketWatch.Accept();
ShowMsg(socketSend.RemoteEndPoint.ToString()+""+"success!!");
//开启一个新线程,不停地接受客户端发过来的消息
Thread th=new Thread(Recive);
th.IsBackground=true;
th.Start(socketSend);
}
catch{
}
}
}
//服务器端不停的接受客户端发过来的消息
void Recive(object o)
{
Socket socketSend=o as Socket;
while(true)
{
try
{
//客户端链接成功后,服务器应该接受客户端发来的消息
byte[] buffer=new byte[1024*1024*2];
//实际接受到的有效字节数
int r=socketSend.Receive(buffer);
if(r==0)
{
break;
}
string str=Encoding.UTF8.GetString(buffer,0,r);
ShowMsg(socketSend.RemoteEndPoint+":"+str);
}
catch
{
}
}
}
void ShowMsg(string str)
{
txtLog.AppendText(str+"\r\n");
}
服务器与客户端通信(客户端)