C# socket多线程编程

服务器与客户端通信(服务器)

//先取消跨线程访问检查
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");

}

服务器与客户端通信(客户端)

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值