这篇文章将为大家详细讲解有关如何使用C#基于WebSocket实现聊天室功能,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

ServerHelper:

usingSystem;usingSystem.Collections;usingSystem.Text;usingSystem.Security.Cryptography;namespaceSocketDemo{//Server助手负责:1握手2请求转换3响应转换classServerHelper{///<summary>///输出连接头信息///</summary>publicstaticstringResponseHeader(stringrequestHeader){Hashtabletable=newHashtable();//拆分成键值对,保存到哈希表string[]rows=requestHeader.Split(newstring[]{"\r\n"},StringSplitOptions.RemoveEmptyEntries);foreach(stringrowinrows){intsplitIndex=row.IndexOf(':');if(splitIndex>0){table.Add(row.Substring(0,splitIndex).Trim(),row.Substring(splitIndex+1).Trim());}}StringBuilderheader=newStringBuilder();header.Append("HTTP/1.1101WebSocketProtocolHandshake\r\n");header.AppendFormat("Upgrade:{0}\r\n",table.ContainsKey("Upgrade")?table["Upgrade"].ToString():string.Empty);header.AppendFormat("Connection:{0}\r\n",table.ContainsKey("Connection")?table["Connection"].ToString():string.Empty);header.AppendFormat("WebSocket-Origin:{0}\r\n",table.ContainsKey("Sec-WebSocket-Origin")?table["Sec-WebSocket-Origin"].ToString():string.Empty);header.AppendFormat("WebSocket-Location:{0}\r\n",table.ContainsKey("Host")?table["Host"].ToString():string.Empty);stringkey=table.ContainsKey("Sec-WebSocket-Key")?table["Sec-WebSocket-Key"].ToString():string.Empty;stringmagic="258EAFA5-E914-47DA-95CA-C5AB0DC85B11";header.AppendFormat("Sec-WebSocket-Accept:{0}\r\n",Convert.ToBase64String(SHA1.Create().ComputeHash(Encoding.ASCII.GetBytes(key+magic))));header.Append("\r\n");returnheader.ToString();}///<summary>///解码请求内容///</summary>publicstaticstringDecodeMsg(Byte[]buffer,intlen){if(buffer[0]!=0x81||(buffer[0]&0x80)!=0x80||(buffer[1]&0x80)!=0x80){returnnull;}Byte[]mask=newByte[4];intbeginIndex=0;intpayload_len=buffer[1]&0x7F;if(payload_len==0x7E){Array.Copy(buffer,4,mask,0,4);payload_len=payload_len&0x00000000;payload_len=payload_len|buffer[2];payload_len=(payload_len<<8)|buffer[3];beginIndex=8;}elseif(payload_len!=0x7F){Array.Copy(buffer,2,mask,0,4);beginIndex=6;}for(inti=0;i<payload_len;i++){buffer[i+beginIndex]=(byte)(buffer[i+beginIndex]^mask[i%4]);}returnEncoding.UTF8.GetString(buffer,beginIndex,payload_len);}///<summary>///编码响应内容///</summary>publicstaticbyte[]EncodeMsg(stringcontent){byte[]bts=null;byte[]temp=Encoding.UTF8.GetBytes(content);if(temp.Length<126){bts=newbyte[temp.Length+2];bts[0]=0x81;bts[1]=(byte)temp.Length;Array.Copy(temp,0,bts,2,temp.Length);}elseif(temp.Length<0xFFFF){bts=newbyte[temp.Length+4];bts[0]=0x81;bts[1]=126;bts[2]=(byte)(temp.Length&0xFF);bts[3]=(byte)(temp.Length>>8&0xFF);Array.Copy(temp,0,bts,4,temp.Length);}else{byte[]st=System.Text.Encoding.UTF8.GetBytes(string.Format("暂不处理超长内容").ToCharArray());}returnbts;}}}

Server:

usingSystem;usingSystem.Collections.Generic;usingSystem.Text;usingSystem.Net;usingSystem.Net.Sockets;namespaceSocketDemo{classClientInfo{publicSocketSocket{get;set;}publicboolIsOpen{get;set;}publicstringAddress{get;set;}}//管理ClientclassClientManager{staticList<ClientInfo>clientList=newList<ClientInfo>();publicstaticvoidAdd(ClientInfoinfo){if(!IsExist(info.Address)){clientList.Add(info);}}publicstaticboolIsExist(stringaddress){returnclientList.Exists(item=>string.Compare(address,item.Address,true)==0);}publicstaticboolIsExist(stringaddress,boolisOpen){returnclientList.Exists(item=>string.Compare(address,item.Address,true)==0&&item.IsOpen==isOpen);}publicstaticvoidOpen(stringaddress){clientList.ForEach(item=>{if(string.Compare(address,item.Address,true)==0){item.IsOpen=true;}});}publicstaticvoidClose(stringaddress=null){clientList.ForEach(item=>{if(address==null||string.Compare(address,item.Address,true)==0){item.IsOpen=false;item.Socket.Shutdown(SocketShutdown.Both);}});}//发送消息到ClientListpublicstaticvoidSendMsgToClientList(stringmsg,stringaddress=null){clientList.ForEach(item=>{if(item.IsOpen&&(address==null||item.Address!=address)){SendMsgToClient(item.Socket,msg);}});}publicstaticvoidSendMsgToClient(Socketclient,stringmsg){byte[]bt=ServerHelper.EncodeMsg(msg);client.BeginSend(bt,0,bt.Length,SocketFlags.None,newAsyncCallback(SendTarget),client);}privatestaticvoidSendTarget(IAsyncResultres){//Socketclient=(Socket)res.AsyncState;//intsize=client.EndSend(res);}}//接收消息classReceiveHelper{publicbyte[]Bytes{get;set;}publicvoidReceiveTarget(IAsyncResultres){Socketclient=(Socket)res.AsyncState;intsize=client.EndReceive(res);if(size>0){stringaddress=client.RemoteEndPoint.ToString();//获取Client的IP和端口stringstringdata=null;if(ClientManager.IsExist(address,false))//握手{stringdata=Encoding.UTF8.GetString(Bytes,0,size);ClientManager.SendMsgToClient(client,ServerHelper.ResponseHeader(stringdata));ClientManager.Open(address);}else{stringdata=ServerHelper.DecodeMsg(Bytes,size);}if(stringdata.IndexOf("exit")>-1){ClientManager.SendMsgToClientList(address+"已从服务器断开",address);ClientManager.Close(address);Console.WriteLine(address+"已从服务器断开");Console.WriteLine(address+""+DateTimeOffset.Now.ToString("G"));return;}else{Console.WriteLine(stringdata);Console.WriteLine(address+""+DateTimeOffset.Now.ToString("G"));ClientManager.SendMsgToClientList(stringdata,address);}}//继续等待client.BeginReceive(Bytes,0,Bytes.Length,SocketFlags.None,newAsyncCallback(ReceiveTarget),client);}}//监听请求classAcceptHelper{publicbyte[]Bytes{get;set;}publicvoidAcceptTarget(IAsyncResultres){Socketserver=(Socket)res.AsyncState;Socketclient=server.EndAccept(res);stringaddress=client.RemoteEndPoint.ToString();ClientManager.Add(newClientInfo(){Socket=client,Address=address,IsOpen=false});ReceiveHelperrs=newReceiveHelper(){Bytes=this.Bytes};IAsyncResultrecres=client.BeginReceive(rs.Bytes,0,rs.Bytes.Length,SocketFlags.None,newAsyncCallback(rs.ReceiveTarget),client);//继续监听server.BeginAccept(newAsyncCallback(AcceptTarget),server);}}classProgram{staticvoidMain(string[]args){Socketserver=newSocket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);server.Bind(newIPEndPoint(IPAddress.Parse("127.0.0.1"),200));//绑定IP+端口server.Listen(10);//开始监听Console.WriteLine("等待连接...");AcceptHelperca=newAcceptHelper(){Bytes=newbyte[2048]};IAsyncResultres=server.BeginAccept(newAsyncCallback(ca.AcceptTarget),server);stringstr=string.Empty;while(str!="exit"){str=Console.ReadLine();Console.WriteLine("ME:"+DateTimeOffset.Now.ToString("G"));ClientManager.SendMsgToClientList(str);}ClientManager.Close();server.Close();}}}

Client:

<!DOCTYPEhtml><script>varmySocket;functionStar(){mySocket=newWebSocket("ws://127.0.0.1:200","my-custom-protocol");mySocket.onopen=functionOpen(){Show("连接打开");};mySocket.onmessage=function(evt){Show(evt.data);};mySocket.onclose=functionClose(){Show("连接关闭");mySocket.close();};}functionSend(){varcontent=document.getElementById("content").value;Show(content);mySocket.send(content);}functionShow(msg){varroomContent=document.getElementById("roomContent");roomContent.innerHTML=msg+"<br/>"+roomContent.innerHTML;}</script><html><head><title></title></head><body><divid="roomContent"style="width:500px;height:200px;overflow:hidden;border:2pxsolid#686868;margin-bottom:10px;padding:10px0px0px10px;"></div><div><textareaid="content"cols="50"rows="3"></textarea></div><inputtype="button"value="Connection"οnclick="Star()"/><inputtype="button"value="Send"οnclick="Send()"/></body></html>

关于“如何使用C#基于WebSocket实现聊天室功能”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。