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);
}
}
以上所述就是本文的全部内容了,希望大家能够喜欢。