C#之Socket客戶端全過(guò)程
c#之socket客戶端全過(guò)程
c#開發(fā)socket客戶端
我們先新建一個(gè)類:socketclientasync。
注意點(diǎn):
1、由于socket通訊是發(fā)送到緩存區(qū)內(nèi)的數(shù)據(jù)是覆蓋,而不是新的,也就是說(shuō)如果我們第一次發(fā)送的內(nèi)容是 byte[]{0x11,0x22};而第二次發(fā)送的內(nèi)容是byte[]{0x22}。那么我們的服務(wù)端在第二次接受到的數(shù)據(jù)是byte[]{0x22,0x22}。
所以我們需要在socket.send(byte[] mes)方法里面聲明
byte[] buffer = new byte[1024]; for (int i = 0; i < buffer.length; i++) ?{ ? ? ? ? buffer[i] = 0x00; }
起到的作用就是每次在發(fā)送新的內(nèi)容到服務(wù)端的時(shí)候,會(huì)將所有的舊的內(nèi)容替換掉;
2、關(guān)閉連接之前需要將通知服務(wù)端停止發(fā)送和接受,也就是
this.clientsocket.shutdown(socketshutdown.both);
中斷套接字連接:通知服務(wù)器端或客戶端停止接收和發(fā)送數(shù)據(jù)。
通知完成之后如果客戶端還連接著再進(jìn)行自己的連接斷開
if (this.clientsocket.connected) ?{ ? ? ? ? ?this.clientsocket.close(); }
3、具體類的代碼見下圖,可以直接使用
? ? #region socketclient客戶端 ? ? public class socketclientasync ? ? { ? ? ? ? #region 聲明變量 ? ? ? ? public string ipadress; ? ? ? ? public bool connected = false; ? ? ? ? public socket clientsocket; ? ? ? ? private ipendpoint hostendpoint; ? ? ? ? private int flag = 0; ? ? ? ? private autoresetevent autoconnectevent = new autoresetevent(false); ? ? ? ? private socketasynceventargs lisntersocketasynceventargs; ? ? ? ? public delegate void startlistehandler(); ? ? ? ? public event startlistehandler startlisten; ? ? ? ? public delegate void receivemsghandler(byte[] info, int i); ? ? ? ? public event receivemsghandler onmsgreceived; ? ? ? ? private list<socketasynceventargs> s_lst = new list<socketasynceventargs>(); ? ? ? ? #endregion ? ? ? ? #region 構(gòu)造函數(shù) ? ? ? ? /// <summary> ? ? ? ? /// 構(gòu)造函數(shù) ? ? ? ? /// </summary> ? ? ? ? /// <param name="hostname"></param> ? ? ? ? /// <param name="port"></param> ? ? ? ? /// <param name="i"></param> ? ? ? ? public socketclientasync(string hostname, int port, int i) ? ? ? ? { ? ? ? ? ? ? flag = i; ? ? ? ? ? ? ipadress = hostname; ? ? ? ? ? ? ipaddress[] hostaddresses = dns.gethostaddresses(hostname); ? ? ? ? ? ? this.hostendpoint = new ipendpoint(hostaddresses[hostaddresses.length - 1], port); ? ? ? ? ? ? this.clientsocket = new socket(this.hostendpoint.addressfamily, sockettype.stream, protocoltype.tcp); ? ? ? ? } ? ? ? ? #endregion ? ? ? ? #region 開始連接服務(wù)端 ? ? ? ? /// <summary> ? ? ? ? /// 連接服務(wù)端 ? ? ? ? /// </summary> ? ? ? ? /// <returns></returns> ? ? ? ? private bool connect() ? ? ? ? { ? ? ? ? ? ? using (socketasynceventargs args = new socketasynceventargs()) ? ? ? ? ? ? { ? ? ? ? ? ? ? ? args.usertoken = this.clientsocket; ? ? ? ? ? ? ? ? args.remoteendpoint = this.hostendpoint; ? ? ? ? ? ? ? ? args.completed += new eventhandler<socketasynceventargs>(this.onconnect); ? ? ? ? ? ? ? ? this.clientsocket.connectasync(args); ? ? ? ? ? ? ? ? bool flag = autoconnectevent.waitone(5000); ? ? ? ? ? ? ? ? if (this.connected) ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? this.lisntersocketasynceventargs = new socketasynceventargs(); ? ? ? ? ? ? ? ? ? ? byte[] buffer = new byte[1024]; ? ? ? ? ? ? ? ? ? ? this.lisntersocketasynceventargs.usertoken = this.clientsocket; ? ? ? ? ? ? ? ? ? ? this.lisntersocketasynceventargs.setbuffer(buffer, 0, buffer.length); ? ? ? ? ? ? ? ? ? ? this.lisntersocketasynceventargs.completed += new eventhandler<socketasynceventargs>(this.onreceive); ? ? ? ? ? ? ? ? ? ? this.startlisten(); ? ? ? ? ? ? ? ? ? ? return true; ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? return false; ? ? ? ? ? ? } ? ? ? ? } ? ? ? ? #endregion ? ? ? ? #region 判斷有沒有連接上服務(wù)端 ? ? ? ? /// <summary> ? ? ? ? /// 判斷有沒有連接上 ? ? ? ? /// </summary> ? ? ? ? /// <param name="sender"></param> ? ? ? ? /// <param name="e"></param> ? ? ? ? private void onconnect(object sender, socketasynceventargs e) ? ? ? ? { ? ? ? ? ? ? this.connected = (e.socketerror == socketerror.success); ? ? ? ? ? ? autoconnectevent.set(); ? ? ? ? } ? ? ? ? #endregion ? ? ? ? #region 發(fā)送數(shù)據(jù)到服務(wù)端 ? ? ? ? /// <summary> ? ? ? ? /// 發(fā)送 ? ? ? ? /// </summary> ? ? ? ? /// <param name="mes"></param> ? ? ? ? public void send(byte[] mes) ? ? ? ? { ? ? ? ? ? ? if (this.connected) ? ? ? ? ? ? { ? ? ? ? ? ? ? ? eventhandler<socketasynceventargs> handler = null; ? ? ? ? ? ? ? ? //byte[] buffer = encoding.default.getbytes(mes); ? ? ? ? ? ? ? ? byte[] buffer = new byte[1024]; ? ? ? ? ? ? ? ? for (int i = 0; i < buffer.length; i++) ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? buffer[i] = 0x00; ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? array.copy(mes, 0, buffer, 0, mes.length); ? ? ? ? ? ? ? ? socketasynceventargs sendersocketasynceventargs = null; ? ? ? ? ? ? ? ? lock (s_lst) ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? if (s_lst.count > 0) ? ? ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? ? ? sendersocketasynceventargs = s_lst[s_lst.count - 1]; ? ? ? ? ? ? ? ? ? ? ? ? s_lst.removeat(s_lst.count - 1); ? ? ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? if (sendersocketasynceventargs == null) ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? sendersocketasynceventargs = new socketasynceventargs(); ? ? ? ? ? ? ? ? ? ? sendersocketasynceventargs.usertoken = this.clientsocket; ? ? ? ? ? ? ? ? ? ? sendersocketasynceventargs.remoteendpoint = this.clientsocket.remoteendpoint; ? ? ? ? ? ? ? ? ? ? if (handler == null) ? ? ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? ? ? handler = delegate(object sender, socketasynceventargs _e) ? ? ? ? ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? ? ? ? ? lock (s_lst) ? ? ? ? ? ? ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? s_lst.add(sendersocketasynceventargs); ? ? ? ? ? ? ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? ? ? ? ? }; ? ? ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? ? ? sendersocketasynceventargs.completed += handler; ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? sendersocketasynceventargs.setbuffer(buffer, 0, buffer.length); ? ? ? ? ? ? ? ? this.clientsocket.sendasync(sendersocketasynceventargs); ? ? ? ? ? ? } ? ? ? ? ? ? else ? ? ? ? ? ? { ? ? ? ? ? ? ? ? this.connected = false; ? ? ? ? ? ? } ? ? ? ? } ? ? ? ? #endregion ? ? ? ? #region 監(jiān)聽服務(wù)端 ? ? ? ? /// <summary> ? ? ? ? /// 監(jiān)聽服務(wù)端 ? ? ? ? /// </summary> ? ? ? ? public void listen() ? ? ? ? { ? ? ? ? ? ? if (this.connected && this.clientsocket != null) ? ? ? ? ? ? { ? ? ? ? ? ? ? ? try ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? (lisntersocketasynceventargs.usertoken as socket).receiveasync(lisntersocketasynceventargs); ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? catch (exception) ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? } ? ? ? ? ? ? } ? ? ? ? } ? ? ? ? #endregion ? ? ? ? #region 斷開服務(wù)端的連接 ? ? ? ? /// <summary> ? ? ? ? /// 斷開連接 ? ? ? ? /// </summary> ? ? ? ? /// <returns></returns> ? ? ? ? private int disconnect() ? ? ? ? { ? ? ? ? ? ? int res = 0; ? ? ? ? ? ? try ? ? ? ? ? ? { ? ? ? ? ? ? ? ? this.clientsocket.shutdown(socketshutdown.both); ? ? ? ? ? ? } ? ? ? ? ? ? catch (exception) ? ? ? ? ? ? { ? ? ? ? ? ? } ? ? ? ? ? ? try ? ? ? ? ? ? { ? ? ? ? ? ? ? ? this.clientsocket.close(); ? ? ? ? ? ? } ? ? ? ? ? ? catch (exception) ? ? ? ? ? ? { ? ? ? ? ? ? } ? ? ? ? ? ? this.connected = false; ? ? ? ? ? ? return res; ? ? ? ? } ? ? ? ? #endregion ? ? ? ? #region 數(shù)據(jù)接收 ? ? ? ? /// <summary> ? ? ? ? /// 數(shù)據(jù)接受 ? ? ? ? /// </summary> ? ? ? ? /// <param name="sender"></param> ? ? ? ? /// <param name="e"></param> ? ? ? ? private void onreceive(object sender, socketasynceventargs e) ? ? ? ? { ? ? ? ? ? ? if (e.bytestransferred == 0) ? ? ? ? ? ? { ? ? ? ? ? ? ? ? if (clientsocket.connected) ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? try ? ? ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? ? ? this.clientsocket.shutdown(socketshutdown.both); ? ? ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? ? ? catch (exception) ? ? ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? ? ? finally ? ? ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? ? ? if (this.clientsocket.connected) ? ? ? ? ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? ? ? ? ? this.clientsocket.close(); ? ? ? ? ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? byte[] info = new byte[] { 0 }; ? ? ? ? ? ? ? ? this.onmsgreceived(info, flag); ? ? ? ? ? ? } ? ? ? ? ? ? else ? ? ? ? ? ? { ? ? ? ? ? ? ? ? byte[] buffer = new byte[e.bytestransferred]; ? ? ? ? ? ? ? ? buffer.blockcopy(e.buffer, 0, buffer, 0, e.bytestransferred); ? ? ? ? ? ? ? ? this.onmsgreceived(buffer, flag); ? ? ? ? ? ? ? ? listen(); ? ? ? ? ? ? } ? ? ? ? } ? ? ? ? #endregion ? ? ? ? #region 建立連接服務(wù)端的方法 ? ? ? ? /// <summary> ? ? ? ? /// 建立連接的方法 ? ? ? ? /// </summary> ? ? ? ? /// <returns></returns> ? ? ? ? public bool connectserver() ? ? ? ? { ? ? ? ? ? ? bool flag = false; ? ? ? ? ? ? this.startlisten += new startlistehandler(socketclient_startlisten); ? ? ? ? ? ? // this.onmsgreceived += new receivemsghandler(socketclient_onmsgreceived); ? ? ? ? ? ? flag = this.connect(); ? ? ? ? ? ? if (!flag) ? ? ? ? ? ? { ? ? ? ? ? ? ? ? return flag; ? ? ? ? ? ? } ? ? ? ? ? ? return true; ? ? ? ? } ? ? ? ? #endregion ? ? ? ? #region 關(guān)閉與服務(wù)端之間的連接 ? ? ? ? /// <summary> ? ? ? ? /// 關(guān)閉連接的方法 ? ? ? ? /// </summary> ? ? ? ? /// <returns></returns> ? ? ? ? public int closelinkserver() ? ? ? ? { ? ? ? ? ? ? return this.disconnect(); ? ? ? ? } ? ? ? ? #endregion ? ? ? ? #region 監(jiān)聽方法 ? ? ? ? /// <summary> ? ? ? ? /// 監(jiān)聽的方法 ? ? ? ? /// </summary> ? ? ? ? private void socketclient_startlisten() ? ? ? ? { ? ? ? ? ? ? this.listen(); ? ? ? ? } ? ? ? ? #endregion ? ? ? ? #region idispose member ? ? ? ? public void dispose() ? ? ? ? { ? ? ? ? ? ? if (this.clientsocket.connected) ? ? ? ? ? ? { ? ? ? ? ? ? ? ? this.clientsocket.close(); ? ? ? ? ? ? } ? ? ? ? } ? ? ? ? #endregion ? ? ? ? #region 析構(gòu)函數(shù) ? ? ? ? ~socketclientasync() ? ? ? ? { ? ? ? ? ? ? try ? ? ? ? ? ? { ? ? ? ? ? ? ? ? if (this.clientsocket.connected) ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? this.clientsocket.close(); ? ? ? ? ? ? ? ? } ? ? ? ? ? ? } ? ? ? ? ? ? catch ? ? ? ? ? ? { ? ? ? ? ? ? } ? ? ? ? ? ? finally ? ? ? ? ? ? { ? ? ? ? ? ? } ? ? ? ? } ? ? ? ? #endregion ? ? } ? ? #endregion
4、然后就是類的調(diào)用了
? ? ? ? //聲明定義變量 ? ? ? ? private socketclientasync clientlink;//客戶端連接對(duì)象 ? ? ? ? private string client_ip = "127.0.0.1";//服務(wù)端ip地址 ? ? ? ? private int client_port = 12345;//服務(wù)端監(jiān)聽的端口號(hào) ? ? ? ? private thread client_td;//通訊內(nèi)部使用線程 ? ? ? ? private bool clientlinkres = false;//服務(wù)器通訊狀態(tài)標(biāo)志 ? ? ? ? private bool threadcontinue = true;//線程輪詢標(biāo)志 ? ? ? ? private bool isonline = false;//是否在線標(biāo)志 ? ? ? ? /// <summary> ? ? ? ? /// 啟動(dòng)線程 ? ? ? ? /// </summary> ? ? ? ? private void startserver() ? ? ? ? { ? ? ? ? ? ? client_td = new thread(linksocketserfunc); ? ? ? ? ? ? client_td.start(); ? ? ? ? } ? ? ? ? /// <summary> ? ? ? ? /// 重連服務(wù)端線程 ? ? ? ? /// </summary> ? ? ? ? private void linksocketserfunc() ? ? ? ? { ? ? ? ? ? ? object lockobj = new object(); ? ? ? ? ? ? int heartbeatcount = 0; ? ? ? ? ? ? clientlink = new socketclientasync(client_ip, client_port, 0); ? ? ? ? ? ? bool notfirstin = false; ? ? ? ? ? ? while (threadcontinue) ? ? ? ? ? ? { ? ? ? ? ? ? ? ? try ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? if (!clientlinkres) ? ? ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? ? ? isonline = false; ? ? ? ? ? ? ? ? ? ? ? ? if (notfirstin) ? ? ? ? ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? ? ? ? ? clientlink.closelinkserver(); ? ? ? ? ? ? ? ? ? ? ? ? ? ? clientlink = new socketclientasync(client_ip, client_port, 0); ? ? ? ? ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? ? ? ? ? notfirstin = true; ? ? ? ? ? ? ? ? ? ? ? ? clientlink.onmsgreceived += new socketclientasync.receivemsghandler(client_onmsgreceived);//綁定接受到服務(wù)端消息的事件 ? ? ? ? ? ? ? ? ? ? ? ? clientlinkres = clientlink.connectserver(); ? ? ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? ? ? else ? ? ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? ? ? //此處寫通訊成功的邏輯處理 ? ? ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? catch (exception ex) ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? clientlinkres = false; ? ? ? ? ? ? ? ? ? ? system.diagnostics.debug.writeline(ex.tostring()); ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? thread.sleep(1000); ? ? ? ? ? ? } ? ? ? ? } ? ? ? ? /// <summary> ? ? ? ? /// 接收消息處理 ? ? ? ? /// </summary> ? ? ? ? /// <param name="info"></param> ? ? ? ? /// <param name="num"></param> ? ? ? ? private void client_onmsgreceived(byte[] info, int num) ? ? ? ? { ? ? ? ? ? ? try ? ? ? ? ? ? { ? ? ? ? ? ? ? ? clientheartbeat = 0; ? ? ? ? ? ? ? ? if (info.length > 0 && info[0] != 0)//bcr連接錯(cuò)誤no ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? //info為接受到服務(wù)器傳過(guò)來(lái)的字節(jié)數(shù)組,需要進(jìn)行什么樣的邏輯處理在此書寫便可 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? else ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? clientlinkres = false; ? ? ? ? ? ? ? ? } ? ? ? ? ? ? } ? ? ? ? ? ? catch (exception ex) ? ? ? ? ? ? { ? ? ? ? ? ? ? ? system.diagnostics.debug.writeline(ex.tostring()); ? ? ? ? ? ? } ? ? ? ? } ? ? ? ? /// <summary> ? ? ? ? /// 終止服務(wù) ? ? ? ? /// </summary> ? ? ? ? public void stopserver() ? ? ? ? { ? ? ? ? ? ? if (clientlinkres) ? ? ? ? ? ? { ? ? ? ? ? ? ? ? threadcontinue = false; ? ? ? ? ? ? ? ? clientlink.closelinkserver(); ? ? ? ? ? ? ? ? clientlink.dispose(); ? ? ? ? ? ? } ? ? ? ? }
這基本的socket客戶端后臺(tái)就寫完了,可以直接復(fù)制使用,平時(shí)都是用這么去寫socket客戶端,分享出來(lái),大家就可以直接使用了!
c#socket客戶端異步實(shí)現(xiàn)
簡(jiǎn)易封裝
using system; using system.collections.generic; using system.linq; using system.text; using system.threading.tasks; using system.net; using system.net.sockets; namespace dclient { ? ? public delegate void delegatemsg(object msg); ? ? public class client ? ? { ? ? ? ? private static socket _clientsocket; ? ? ? ? private static string _server; ? ? ? ? private static int _port; ? ? ? ? public static delegatemsg onconnect; ? ? ? ? public static delegatemsg onsend; ? ? ? ? public static delegatemsg onreceive; ? ? ? ? public static delegatemsg onserverdown; ? ? ? ? public static delegatemsg onerr; ? ? ? ? public static void connect() ? ? ? ? { ? ? ? ? ? ? try ? ? ? ? ? ? { ? ? ? ? ? ? ? ? _server = system.configuration.configurationmanager.appsettings["serverip"]; ? ? ? ? ? ? ? ? _port = int.parse(system.configuration.configurationmanager.appsettings["serverport"]); ? ? ? ? ? ? ? ? ipendpoint ip = new ipendpoint(ipaddress.parse(_server), _port); ? ? ? ? ? ? ? ? _clientsocket = new socket(addressfamily.internetwork, sockettype.stream, protocoltype.tcp); ? ? ? ? ? ? ? ? _clientsocket.beginconnect(ip, new asynccallback(connectcallback), _clientsocket); ? ? ? ? ? ? } ? ? ? ? ? ? catch (exception e) ? ? ? ? ? ? { ? ? ? ? ? ? ? ? throw e; ? ? ? ? ? ? } ? ? ? ? } ? ? ? ? private static void connectcallback(iasyncresult iar) ? ? ? ? { ? ? ? ? ? ? socket client = (socket)iar.asyncstate; ? ? ? ? ? ? try ? ? ? ? ? ? { ? ? ? ? ? ? ? ? client.endconnect(iar); ? ? ? ? ? ? ? ? onconnect("已連接"); ? ? ? ? ? ? } ? ? ? ? ? ? catch (socketexception e) ? ? ? ? ? ? { ? ? ? ? ? ? ? ? if (e.errorcode == 10061) ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? onerr("服務(wù)器程序未運(yùn)行或服務(wù)器端口未開放"); ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? else ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? onerr(e.message); ? ? ? ? ? ? ? ? } ? ? ? ? ? ? } ? ? ? ? ? ? finally ? ? ? ? ? ? { ? ? ? ? ? ? } ? ? ? ? } ? ? ? ? public static void send(string msg) ? ? ? ? { ? ? ? ? ? ? if (_clientsocket == null || msg == string.empty) return; ? ? ? ? ? ? msg += "\r\n"; ? ? ? ? ? ? byte[] data = encoding.utf8.getbytes(msg); ? ? ? ? ? ? try ? ? ? ? ? ? { ? ? ? ? ? ? ? ? _clientsocket.beginsend(data, 0, data.length, socketflags.none, asyncresult => ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? int length = _clientsocket.endsend(asyncresult); ? ? ? ? ? ? ? ? ? ? onsend(string.format("客戶端發(fā)送消息:{0}", msg)); ? ? ? ? ? ? ? ? }, null); ? ? ? ? ? ? } ? ? ? ? ? ? catch (exception e) ? ? ? ? ? ? { ? ? ? ? ? ? ? ? onerr(e.message); ? ? ? ? ? ? } ? ? ? ? } ? ? ? ? public static void recive() ? ? ? ? { ? ? ? ? ? ? byte[] data = new byte[1024]; ? ? ? ? ? ? try ? ? ? ? ? ? { ? ? ? ? ? ? ? ? _clientsocket.beginreceive(data, 0, data.length, socketflags.none, ? ? ? ? ? ? ? ? asyncresult => ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? try ? ? ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? ? ? int length = _clientsocket.endreceive(asyncresult); ? ? ? ? ? ? ? ? ? ? ? ? onreceive(string.format("收到服務(wù)器消息:長(zhǎng)度:{1},{0}", encoding.utf8.getstring(data), length)); ? ? ? ? ? ? ? ? ? ? ? ? recive(); ? ? ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? ? ? catch (socketexception e) ? ? ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? ? ? if (e.errorcode == 10054) ? ? ? ? ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? ? ? ? ? onserverdown("服務(wù)器已斷線"); ? ? ? ? ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? ? ? ? ? else ? ? ? ? ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? ? ? ? ? onerr(e.message); ? ? ? ? ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? }, null); ? ? ? ? ? ? } ? ? ? ? ? ? catch (exception ex) ? ? ? ? ? ? { ? ? ? ? ? ? ? ? onerr(ex.message); ? ? ? ? ? ? } ? ? ? ? } ? ? } }
使用
? public partial class form1 : form ? ? { ? ? ? ? public form1() ? ? ? ? { ? ? ? ? ? ? initializecomponent(); ? ? ? ? ? ? client.onconnect += new delegatemsg(connect); ? ? ? ? ? ? client.onsend += new delegatemsg(send); ? ? ? ? ? ? client.onreceive += new delegatemsg(receive); ? ? ? ? ? ? client.onserverdown += new delegatemsg(svrdown); ? ? ? ? ? ? client.onerr += new delegatemsg(onerr); ? ? ? ? } ? ? ? ? private void form1_load(object sender, eventargs e) ? ? ? ? { ? ? ? ? ? ? client.connect(); ? ? ? ? } ? ? ? ? private void connect(object msg) ? ? ? ? { ? ? ? ? ? ? system.diagnostics.debug.writeline(msg.tostring()); ? ? ? ? ? ? client.send("dalo 發(fā)送測(cè)試"); ? ? ? ? ? ? client.recive(); ? ? ? ? } ? ? ? ? private void send(object msg) ? ? ? ? { ? ? ? ? ? ? system.diagnostics.debug.writeline(msg.tostring()); ? ? ? ? } ? ? ? ? private void receive(object msg) ? ? ? ? { ? ? ? ? ? ? system.diagnostics.debug.writeline(msg.tostring()); ? ? ? ? } ? ? ? ? private void svrdown(object msg) ? ? ? ? { ? ? ? ? ? ? system.diagnostics.debug.writeline(msg.tostring()); ? ? ? ? } ? ? ? ? private void onerr(object msg) ? ? ? ? { ? ? ? ? ? ? system.diagnostics.debug.writeline(msg.tostring()); ? ? ? ? } ? ? }
未實(shí)現(xiàn)的幾個(gè)常用操作
1、接收服務(wù)器發(fā)送的大數(shù)據(jù)量的合包。
2、服務(wù)器斷線后客戶端自動(dòng)檢測(cè)并重連,需先將_clientsocket釋放。
3、心跳包。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持碩編程。