最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#之Socket客戶端全過程

 更新時間:2023年05月08日 11:38:22   作者:工控程序狗  
這篇文章主要介紹了C#之Socket客戶端全過程,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

C#開發(fā)Socket客戶端

我們先新建一個類:SocketClientAsync。

注意點:

1、由于Socket通訊是發(fā)送到緩存區(qū)內的數(shù)據(jù)是覆蓋,而不是新的,也就是說如果我們第一次發(fā)送的內容是 byte[]{0x11,0x22};而第二次發(fā)送的內容是byte[]{0x22}。那么我們的服務端在第二次接受到的數(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ā)送新的內容到服務端的時候,會將所有的舊的內容替換掉;

2、關閉連接之前需要將通知服務端停止發(fā)送和接受,也就是

this.clientSocket.Shutdown(SocketShutdown.Both);

中斷套接字連接:通知服務器端或客戶端停止接收和發(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 構造函數(shù)
? ? ? ? /// <summary>
? ? ? ? /// 構造函數(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 開始連接服務端
? ? ? ? /// <summary>
? ? ? ? /// 連接服務端
? ? ? ? /// </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 判斷有沒有連接上服務端
? ? ? ? /// <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ù)到服務端
? ? ? ? /// <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)聽服務端
? ? ? ? /// <summary>
? ? ? ? /// 監(jiān)聽服務端
? ? ? ? /// </summary>
? ? ? ? public void Listen()
? ? ? ? {
? ? ? ? ? ? if (this.connected && this.clientSocket != null)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? try
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? (lisnterSocketAsyncEventArgs.UserToken as Socket).ReceiveAsync(lisnterSocketAsyncEventArgs);
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? catch (Exception)
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? #endregion
? ? ? ? #region 斷開服務端的連接
? ? ? ? /// <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 建立連接服務端的方法
? ? ? ? /// <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 關閉與服務端之間的連接
? ? ? ? /// <summary>
? ? ? ? /// 關閉連接的方法
? ? ? ? /// </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 析構函數(shù)
? ? ? ? ~SocketClientAsync()
? ? ? ? {
? ? ? ? ? ? try
? ? ? ? ? ? {
? ? ? ? ? ? ? ? if (this.clientSocket.Connected)
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? this.clientSocket.Close();
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? ? ? catch
? ? ? ? ? ? {
? ? ? ? ? ? }
? ? ? ? ? ? finally
? ? ? ? ? ? {
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? #endregion
? ? }
? ? #endregion

4、然后就是類的調用了

? ? ? ? //聲明定義變量
? ? ? ? private SocketClientAsync ClientLink;//客戶端連接對象
? ? ? ? private string Client_IP = "127.0.0.1";//服務端IP地址
? ? ? ? private int Client_Port = 12345;//服務端監(jiān)聽的端口號
? ? ? ? private Thread Client_Td;//通訊內部使用線程
? ? ? ? private bool ClientLinkRes = false;//服務器通訊狀態(tài)標志
? ? ? ? private bool ThreadContinue = true;//線程輪詢標志
? ? ? ? private bool isOnline = false;//是否在線標志
? ? ? ? /// <summary>
? ? ? ? /// 啟動線程
? ? ? ? /// </summary>
? ? ? ? private void StartServer()
? ? ? ? {
? ? ? ? ? ? Client_Td = new Thread(LinkSocketSerFunc);
? ? ? ? ? ? Client_Td.Start();
? ? ? ? }
? ? ? ? /// <summary>
? ? ? ? /// 重連服務端線程
? ? ? ? /// </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);//綁定接受到服務端消息的事件
? ? ? ? ? ? ? ? ? ? ? ? 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為接受到服務器傳過來的字節(jié)數(shù)組,需要進行什么樣的邏輯處理在此書寫便可 ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? else
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ClientLinkRes = false;
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? ? ? catch (Exception ex)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? System.Diagnostics.Debug.WriteLine(ex.ToString());
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? /// <summary>
? ? ? ? /// 終止服務
? ? ? ? /// </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("服務器程序未運行或服務器端口未開放");
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? 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("收到服務器消息:長度:{1},{0}", Encoding.UTF8.GetString(data), length));
? ? ? ? ? ? ? ? ? ? ? ? Recive();
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? catch (SocketException e)
? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? if (e.ErrorCode == 10054)
? ? ? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? ? ? OnServerDown("服務器已斷線");
? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? ? ? 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、接收服務器發(fā)送的大數(shù)據(jù)量的合包。

2、服務器斷線后客戶端自動檢測并重連,需先將_clientSocket釋放。

3、心跳包。

總結

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • C# 使用SharpZipLib生成壓縮包的實例代碼

    C# 使用SharpZipLib生成壓縮包的實例代碼

    SharpZipLib是一個C#的類庫,主要用來解壓縮Zip,GZip,BZip2,Tar等格式,是以托管程序集的方式實現(xiàn),可以方便的應用于其他的項目之中。本文通過一個實例代碼給大家介紹了C# 使用SharpZipLib生成壓縮包的方法,感興趣的朋友跟隨小編一起看看吧
    2018-09-09
  • C#如何實現(xiàn)圖片查看器

    C#如何實現(xiàn)圖片查看器

    這篇文章主要為大家詳細介紹了C#如何實現(xiàn)圖片查看器的相關方法,C#實現(xiàn)一個像Windows自帶的圖片查看器的功能,感興趣的小伙伴們可以參考一下
    2016-04-04
  • C#創(chuàng)建自定義控件的示例

    C#創(chuàng)建自定義控件的示例

    這篇文章主要介紹了C#創(chuàng)建自定義控件的示例,幫助大家更好的理解和學習c#,感興趣的朋友可以了解下
    2020-10-10
  • C#實現(xiàn)單例模式的多種方式

    C#實現(xiàn)單例模式的多種方式

    這篇文章介紹了C#實現(xiàn)單例模式的多種方式,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-01-01
  • c# 代理模式

    c# 代理模式

    代理模式:為其他對象提供一種代理以控制其他對象的訪問
    2012-10-10
  • WinForm生成驗證碼圖片的方法

    WinForm生成驗證碼圖片的方法

    這篇文章主要介紹了WinForm生成驗證碼圖片的方法,涉及WinForm字符串及圖形操作的相關技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2016-06-06
  • C#連接MySQL數(shù)據(jù)庫的方法步驟

    C#連接MySQL數(shù)據(jù)庫的方法步驟

    最近兩天在解決C#連接MySql數(shù)據(jù)庫的問題,通過不同的從網(wǎng)上學習,最終找到了解決的辦法,下面這篇文章主要給大家介紹了關于C#連接MySQL數(shù)據(jù)庫的方法步驟,需要的朋友可以參考下
    2023-01-01
  • AjaxControlToolkit AjaxFileUpload 顯示英文改成中文的解決方法

    AjaxControlToolkit AjaxFileUpload 顯示英文改成中文的解決方法

    AjaxControlToolkit AjaxFileUpload 顯示英文改成中文的解決方法,需要的朋友可以參考一下
    2013-03-03
  • C#先判斷是否存在再創(chuàng)建文件夾或文件與遞歸計算文件夾大小

    C#先判斷是否存在再創(chuàng)建文件夾或文件與遞歸計算文件夾大小

    這篇文章介紹了C#先判斷是否存在再創(chuàng)建文件夾或文件與遞歸計算文件夾大小的方法,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-07-07
  • WPF實現(xiàn)動畫效果(五)之關鍵幀動畫

    WPF實現(xiàn)動畫效果(五)之關鍵幀動畫

    這篇文章介紹了WPF實現(xiàn)動畫效果之關鍵幀動畫,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-06-06

最新評論

上蔡县| 老河口市| 河津市| 嘉兴市| 乳源| 和龙市| 六盘水市| 利辛县| 五台县| 沾益县| 广安市| 海口市| 麻城市| 和林格尔县| 北海市| 镇江市| 太原市| 喜德县| 拜城县| 茌平县| 蒙自县| 潼南县| 太和县| 万源市| 福贡县| 岗巴县| 乌兰察布市| 班戈县| 六枝特区| 晋宁县| 和平县| 敦煌市| 江阴市| 松江区| 互助| 望都县| 晴隆县| 鲜城| 白朗县| 佳木斯市| 蕲春县|