写文不容易,请尊重原创:转载注明 http://blog.csdn.net/meng6098
简陋聊天室简单的asp.net代码实现:
public static Dictionary<string, WebSocket> WSdic = SocketHelper.GetDic; //链接对象字典及用户字典
public static Dictionary<string, object> dicjson = new Dictionary<string, object>();
public WebSocket socket = null;
public Thread thread = null;
ArraySegment<byte> buffer = new ArraySegment<byte>(new byte[1024]);
//封装的发送方法
private void RetenMsg(string msg,int i=-1)
{
string remsg = "{\"Msg\":\"" + msg + "\"}";
if (i!=-1)
{
i = WSdic.Count;
remsg = "{\"Msg\":\"" + msg + "\",\"nums\":\""+i+"\"}";
}
foreach (var dic in WSdic)//将消息分别发送给所有用户
{
ArraySegment<byte> buffer = new ArraySegment<byte>(Encoding.UTF8.GetBytes(remsg));
dic.Value.SendAsync(buffer, System.Net.WebSockets.WebSocketMessageType.Text, true, System.Threading.CancellationToken.None);
}
}
//创建异步方法
public async Task DoTalking(AspNetWebSocketContext context)
{
bool isAdd = false;//判断此socket是否加入到集合中
socket = context.WebSocket;
WebSocketReceiveResult result = await socket.ReceiveAsync(buffer, CancellationToken.None);//从链接异步接受数据
if (socket.State != WebSocketState.Open)//当前用户为不是链接状态
return;
}
解析数据
如果是用户接入且链接状态为open将用户名和ws对象放入到用户字典中
while (true) {
获取ws数据
/*这里有一个好玩的地方。当获取ws数据的时候。当有客户端有消息传入的时候才进入到下边否则在此停住,所以不用害怕while把你的服务器拖死*/
if (socket.State == WebSocketState.Open)//当链接状态
{
对内容进行判断
如果是消息则执行消息发送方法
}
Else//当不是链接状态时跳出死循环,执行移除方法
{
break;
}
}
if (isAdd&&WSdic.ContainsKey(extstr))//移除关闭的socket
{
执行移除方法
}
}