c#实现多线程局域网聊天系统
觉得好有点帮助就顶一下啦。
socke编程,支持多客户端,多线程操作避免界面卡死。
开启socket
privatevoidbutton1_Click(objectsender,EventArgse) { try { intport=int.Parse(txt_port.Text); stringhost=txt_ip.Text; //创建终结点 IPAddressip=IPAddress.Parse(host); IPEndPointipe=newIPEndPoint(ip,port); //创建Socket并开始监听 newsock=newSocket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);//创建一个Socket对象,如果用UDP协议,则要用SocketTyype.Dgram类型的套接字 newsock.Bind(ipe);//绑定EndPoint对象 newsock.Listen(0);//开始监听 //为新建立的连接创建新的Socket acceptClientThread=newThread(newThreadStart(AcceptClient)); acceptClientThread.Start(); SetText("开始监听"); } catch(Exceptionexp) { CommonFunction.WriteLog(exp,exp.Message); } }
监控端口,接收客户端
///<summary> ///接受客户端,可接受多个客户端同时连入,并对连入的客户端注册到客户端列表 ///</summary> publicvoidAcceptClient() { try { while(true) { Socketclient=newsock.Accept(); ip=client.Handle; RegeistUser(client.Handle,client); ThreadclientThread=newThread(newParameterizedThreadStart(ReceiveData)); objecto=client; clientThread.Start(o); } } catch(Exceptionexp) { CommonFunction.WriteLog(exp,exp.Message); } }
接收客户端数据并广播数据
///<summary> ///接收客户端数据并,转发到目标客户端。 ///</summary> publicvoidReceiveData(objecto) { try { while(true) { Socketclient=(Socket)o; stringrecvStr=""; byte[]recvBytes=newbyte[1024]; intbytes; bytes=client.Receive(recvBytes,recvBytes.Length,0);//从客户端接受消息 recvStr=Encoding.UTF8.GetString(recvBytes,0,bytes); SendMessage(client,recvStr); SetText(recvStr); CommonFunction.WriteErrorLog(recvStr); } } catch(Exceptionexp) { CommonFunction.WriteLog(exp,exp.Message); } }
判断是用户注册还是发送消息
///<summary> ///判断是用户注册还是发送消息 ///</summary> ///<paramname="p_strMessage"></param> publicvoidSendMessage(Socketclient,stringp_strMessage) { if(p_strMessage.StartsWith("@")) { RegeistUser(p_strMessage,client); } elseif(p_strMessage.StartsWith(">")) { DeleteClident(p_strMessage); } else { //SendMessageToTarget(p_strMessage); SendAllMessage(p_strMessage); } }
将socket注册为指定用户名
///<summary> ///将socket注册为指定用户名 ///</summary> ///<paramname="user"></param> ///<paramname="ss"></param> publicvoidRegeistUser(stringuser,Socketss) { user=user.Remove(0,1); userSocketDict.Add(user,ss); SendOneMessage(ss,"欢迎"+user+"连入!"); RefreshClient(); }
从客户端字典中移除客户端
///<summary> ///从客户端字典中移除客户端 ///</summary> ///<paramname="p_strMessage"></param> publicvoidDeleteClident(stringp_strMessage) { p_strMessage=p_strMessage.Remove(0,1); userSocketDict.Remove(p_strMessage); RefreshClient(); }
群发消息
///<summary> ///群发消息 ///</summary> ///<paramname="p_strsend"></param> publicvoidSendAllMessage(stringp_strsend) { //MessageBox.Show(p_strsend); foreach(stringiteminuserSocketDict.Keys) { byte[]bs=Encoding.UTF8.GetBytes(p_strsend); userSocketDict[item].Send(bs,bs.Length,0); } }
给文本框赋值
publicdelegatevoidSetTextHandler(stringtext); ///<summary> ///给文本框赋值 ///</summary> ///<paramname="text"></param> privatevoidSetText(stringtext) { if(rich_back.InvokeRequired==true) { SetTextHandlerset=newSetTextHandler(SetText);//委托的方法参数应和SetText一致 rich_back.Invoke(set,newobject[]{text});//此方法第二参数用于传入方法,代替形参text } else { rich_back.Text+="\n"+text; } }
连入服务器
privatevoidbutton1_Click(objectsender,EventArgse) { try { user=txt_name.Text; intport=int.Parse(txt_port.Text); stringhost=txt_ip.Text; //创建终结点EndPoint IPAddressip=IPAddress.Parse(host); IPEndPointipe=newIPEndPoint(ip,port);//把ip和端口转化为IPEndPoint的实例 //创建Socket并连接到服务器 Socketc=newSocket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);//创建Socket cc=c; c.Connect(ipe);//连接到服务器 clientThread=newThread(newThreadStart(ReceiveData)); clientThread.Start(); //向服务器发送本机用户名,以便服务器注册客户端 SendMessage("@"+txt_name.Text); } catch(ArgumentExceptionex) { Console.WriteLine("argumentNullException:{0}",ex); } catch(SocketExceptionexp) { Console.WriteLine("SocketException:{0}",exp); } }
向服务器发送消息
privatevoidbutton3_Click(objectsender,EventArgse) { if(""==txt_target.Text) { MessageBox.Show("未选择对话人物"); return; } //向服务器发送信息 stringsendStr=txt_name.Text+"@"+target+":"+txt_message.Text; SendMessage(sendStr); rch_back.Text+="\n"+sendStr; txt_message.Text=""; }
隐身
privatevoidbutton2_Click(objectsender,EventArgse) { try { SendMessage(">"+txt_name.Text); //cc.Disconnect(true); //cc.Shutdown(SocketShutdown.Both); //cc.Close(); } catch(Exceptionexp) { CommonFunction.WriteLog(exp,exp.Message); } }
以上所述就是本文的全部内容了,希望大家能够喜欢。