欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C#之Socket客戶端全過程

 更新時間:2023年05月08日 11:38:22   作者:工控程序狗  
這篇文章主要介紹了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中DefWndProc、WndProc與IMessageFilter的區(qū)別,較為詳細的分析了WinForm的消息處理機制,需要的朋友可以參考下
    2014-08-08
  • 詳解C#如何使用屏障實現(xiàn)多線程并發(fā)操作保持同步

    詳解C#如何使用屏障實現(xiàn)多線程并發(fā)操作保持同步

    這篇文章主要為大家詳細介紹了C#如何使用屏障實現(xiàn)多線程并發(fā)操作保持同步,文中的示例代碼簡潔易懂,具有一定的借鑒價值,有需要的小伙伴可以參考下
    2024-01-01
  • C#3.0中Lambda表達式詳解

    C#3.0中Lambda表達式詳解

    在C#3.0中,微軟給我?guī)淼囊恍┬绿匦钥赡苁且郧八虚_發(fā)語言都沒有的特性。這無疑大大的體現(xiàn)了C#3.0在開發(fā)語言中強大的優(yōu)勢
    2013-09-09
  • 詳解C#App.config和Web.config加密

    詳解C#App.config和Web.config加密

    本篇文章給大家分享了C#App.config和Web.config加密的相關(guān)知識點以及具體代碼步驟,有興趣的朋友參考學習下。
    2018-05-05
  • C#中TextBox的橫線樣式及占位提示詳解

    C#中TextBox的橫線樣式及占位提示詳解

    橫線樣式就是將TextBox以一條底橫線的形式展示在頁面,占位提示就是Web的Placeholder屬性,即在輸入框沒有內(nèi)容的時候進行一個輸入提示。本文主要介紹了C#中TextBox的這兩個的實現(xiàn),需要的可以參考一下
    2022-11-11
  • WPF+DiffPlex實現(xiàn)文本比對工具

    WPF+DiffPlex實現(xiàn)文本比對工具

    現(xiàn)行的文本編輯器大多都具備文本查詢的能力,但是并不能直觀的告訴用戶兩段文字的細微差異,所以對比工具在某種情況下,就起到了很便捷的效率。本文將利用DiffPlex實現(xiàn)簡易的文本比對工具,需要的可以參考一下
    2022-11-11
  • C#中數(shù)組初始化與數(shù)組元素復制的方法

    C#中數(shù)組初始化與數(shù)組元素復制的方法

    這篇文章主要介紹了C#中數(shù)組初始化與數(shù)組元素復制的方法,涉及C#中數(shù)組的創(chuàng)建、初始化及使用Array.Copy方法復制數(shù)組元素的技巧,需要的朋友可以參考下
    2015-04-04
  • C#窗體間通訊處理的幾種方法總結(jié)

    C#窗體間通訊處理的幾種方法總結(jié)

    這篇文章主要介紹了
    2013-11-11
  • C#計算代碼執(zhí)行時間的方法

    C#計算代碼執(zhí)行時間的方法

    在一些測試工作時我們需要獲得高精度的代碼執(zhí)行時間以比較其效率。
    2013-03-03
  • C#實現(xiàn)XML文件操作詳解

    C#實現(xiàn)XML文件操作詳解

    這篇文章主要為大家詳細介紹了如何利用C#實現(xiàn)XML操作文件,文中的示例代碼講解詳細,對我們學習C#有一定的幫助,感興趣的小伙伴可以跟隨小編一起了解一下
    2022-12-12

最新評論