年终有空咯,分享一下自己封装的socket类库. 由于公司写的socket代码非常醉人,我不能忍,所以自己封装了一下方便大家使用,现在有空也分享给园友用用看,现在还存在一定的问题,等下我列出来,希望大家能帮我出一些解决方案,完善这个东东.
直接开讲,不废话了,一共3块,服务端,客户端,websocket
一:服务端
ServerListener listener = new ServerListener();
1.构造函数:
2.事件:
//日志,内部的处理日志,主要用来看流程,实际用处不大.
listener.Log += listener_Log; //listener_Log(string msg)
//客户端上线
listener.ClientConnected += listener_ClientConnected; //listener_ClientConnected(BaseClient t)
//客户端下线
listener.ClientDisconnect += listener_ClientDisconnect; //listener_ClientDisconnect(BaseClient t)
//接收到完整消息
listener.MsgRead += listener_MsgRead; //listener_MsgRead(BaseClient t, byte[] t2)
说明:1.Log中msg参数是执行流程的消息, 2.t是当前客户端对象, 3.t2完整消息数据
3.方法:
//调用start启动监听;
listener.Start();
//停止监听
listener.Stop(); //广播消息,msg发送的内容,
//type发送到客户端类型,传null发送到所有类型
//(目前只有socket和websocket2个类型)
listener.SendAll(byte[] msg, ClientType? type) //还有一个属性
//在线客户端集合
listener.Clients
二:客户端
Client client = new Client();
1.构造函数:
2.事件
//日志
client.Log += client_Log; //client_Log(BaseClient t, string t2)
//断开连接
client.ClientDisconnect += client_ClientDisconnect; //client_ClientDisconnect(BaseClient t)
//连接服务器成功
client.ClientConnected += client_ClientConnected; //client_ClientConnected(BaseClient t,bool state,string msg)
//发送完一条消息
client.MsgSend += client_MsgSend; //client_MsgSend(BaseClient t)
//接收到完整消息
client.MsgRead += client_MsgRead; //client_MsgRead(BaseClient t, byte[] t2)
3.方法
//启动连接服务器
client.Start();
//断开连接
client.Stop();
//发送数据
client.SendData(byte[] data)
4.属性
/// <summary>
/// 自动重连,默认false
/// </summary>
public bool AutoChonglian { get; set; } /// <summary>
/// Id
/// </summary>
public Guid Id { get; set; } /// <summary>
/// 远程网络地址
/// </summary>
public EndPoint RemoteIp{get;set;} /// <summary>
/// 本地网络地址
/// </summary>
public EndPoint LocalIp{get;set;} /// <summary>
/// 客户端类型
/// </summary>
public ClientType ClientType { get; private set; } /// <summary>
/// 客户端对象是否为空
/// </summary>
public bool ClientIsNull{get;private set;}
三:WebSocket
websocket已经在服务端封装好了,直接连接就能通讯,这里唯一要讲一下的就是send的时候需要注意数据长度不能超过8184,超过分段发,还是给一段js出来 大家自己看把
function addMsg(msg){
$("#msg").append("<p>"+msg+"</p>");
} var websocket = new WebSocket("ws://ip:port/");
websocket.onopen = function onOpen() {
addMsg("已连接到服务器");
};
websocket.onclose = function onClose() {
addMsg("服务器连接断开");
};
websocket.onerror = function onError() {
addMsg("连接服务器失败");
}
websocket.onmessage = function onMessage(evt) {
var data = evt.data;
addMsg(data);
};
websocket.SendObj = function(obj) {
return websocket.Send(obj + "⊙");
};
websocket.sendlen = 8184; //分段发送数据长度不能超过8184
websocket.Send = function (msg) {
if (websocket != null && websocket.readyState === websocket.OPEN) {
if (msg.length > websocket.sendlen) {
var sendcount = Math.ceil(msg.length / websocket.sendlen);
for (var i = 0; i < sendcount; i++) {
var d = msg.substring(i * websocket.sendlen, websocket.sendlen * (i + 1));
websocket.send(d);
}
} else {
websocket.send(msg);
}
return true;
} else {
addMsg("指令发送失败(与服务器断开连接)");
return false;
}
}; websocket.SendObj("发送数据,一般是json字符串,反正随便你");
现在来说说还需要完整的地方
1.文件传输还没有做.
2.websocket 客户端发送大数据会有问题, 现在的情况 数据长度小于8184*5 不会有问题, 数据长度大于8184*10会频繁出现服务器接收数据异常问题, 这里求大神帮忙看看!!!
还有个问题 循环发送大量数据也会出现问题比如 for 20次 sendobj("1")
服务端发送大数据到客户端没有问题
完事! 不介意骗点分吧 0.0