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è)參考,也希望大家多多支持碩編程

下一節(jié):c#實(shí)現(xiàn)上位機(jī)與歐姆龍plc通訊(fins)

c# 教程

相關(guān)文章
亚洲国产精品第一区二区,久久免费视频77,99V久久综合狠狠综合久久,国产免费久久九九免费视频