C#之Socket客戶端全過程
C#開發(fā)Socket客戶端
我們先新建一個類:SocketClientAsync。
注意點:
1、由于Socket通訊是發(fā)送到緩存區(qū)內(nèi)的數(shù)據(jù)是覆蓋,而不是新的,也就是說如果我們第一次發(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ù)端的時候,會將所有的舊的內(nèi)容替換掉;
2、關(guān)閉連接之前需要將通知服務(wù)端停止發(fā)送和接受,也就是
this.clientSocket.Shutdown(SocketShutdown.Both);
中斷套接字連接:通知服務(wù)器端或客戶端停止接收和發(fā)送數(shù)據(jù)。
通知完成之后如果客戶端還連接著再進行自己的連接斷開
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;//客戶端連接對象 ? ? ? ? private string Client_IP = "127.0.0.1";//服務(wù)端IP地址 ? ? ? ? private int Client_Port = 12345;//服務(wù)端監(jiān)聽的端口號 ? ? ? ? private Thread Client_Td;//通訊內(nèi)部使用線程 ? ? ? ? private bool ClientLinkRes = false;//服務(wù)器通訊狀態(tài)標志 ? ? ? ? private bool ThreadContinue = true;//線程輪詢標志 ? ? ? ? private bool isOnline = false;//是否在線標志 ? ? ? ? /// <summary> ? ? ? ? /// 啟動線程 ? ? ? ? /// </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連接錯誤NO ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? //info為接受到服務(wù)器傳過來的字節(jié)數(shù)組,需要進行什么樣的邏輯處理在此書寫便可 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? 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客戶端后臺就寫完了,可以直接復制使用,平時都是用這么去寫Socket客戶端,分享出來,大家就可以直接使用了!
C#Socket客戶端異步實現(xià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ù)器程序未運行或服務(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ù)器消息:長度:{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ā)送測試"); ? ? ? ? ? ? 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()); ? ? ? ? } ? ? }
未實現(xiàn)的幾個常用操作
1、接收服務(wù)器發(fā)送的大數(shù)據(jù)量的合包。
2、服務(wù)器斷線后客戶端自動檢測并重連,需先將_clientSocket釋放。
3、心跳包。
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
WinForm中DefWndProc、WndProc與IMessageFilter的區(qū)別
這篇文章主要介紹了WinForm中DefWndProc、WndProc與IMessageFilter的區(qū)別,較為詳細的分析了WinForm的消息處理機制,需要的朋友可以參考下2014-08-08詳解C#如何使用屏障實現(xiàn)多線程并發(fā)操作保持同步
這篇文章主要為大家詳細介紹了C#如何使用屏障實現(xiàn)多線程并發(fā)操作保持同步,文中的示例代碼簡潔易懂,具有一定的借鑒價值,有需要的小伙伴可以參考下2024-01-01