當前位置:編程學習大全網 - 源碼破解 - c#之UDP協議的異步通信怎麽做

c#之UDP協議的異步通信怎麽做

UDP服務器:

using?System;

using?System.Text;

using?System.Net;

using?System.Net.Sockets;

namespace?ConsoleUdpServer

{

class?Program

{

static?void?Main(string[]?args)

{

Socket?socket?=?new?Socket(AddressFamily.InterNetwork,

SocketType.Dgram,

ProtocolType.Udp);

EndPoint?localEP?=?new?IPEndPoint(IPAddress.Parse("127.0.0.1"),?8002);

socket.Bind(localEP);

//啟動異步接收

State?state?=?new?State(socket);

socket.BeginReceiveFrom(

state.Buffer,?0,?state.Buffer.Length,

SocketFlags.None,

ref?state.RemoteEP,

EndReceiveFromCallback,

state);

Console.ReadLine();

socket.Close();

}

//異步接收回調函數

static?void?EndReceiveFromCallback(IAsyncResult?iar)

{

State?state?=?iar.AsyncState?as?State;

Socket?socket?=?state.Socket;

try

{

//完成接收

int?byteRead?=?socket.EndReceiveFrom(iar,?ref?state.RemoteEP);

//顯示客戶端地址和端口

Console.WriteLine("客戶端終結點:{0}",?state.RemoteEP.ToString());

//顯示接收信息

Console.WriteLine("接收數據字節數:{0}",?byteRead);

string?message?=?Encoding.Default.GetString(state.Buffer,?0,?byteRead);

Console.WriteLine("來著客戶端信息:{0}",?message);

//向客戶端發送信息

SendMeaage(socket,?state.RemoteEP,?"成功接收!");

}

catch?(Exception?e)

{

Console.WriteLine("發生異常!異常信息:");

Console.WriteLine(e.Message);

}

finally

{

//非常重要:繼續異步接收

socket.BeginReceiveFrom(

state.Buffer,?0,?state.Buffer.Length,

SocketFlags.None,

ref?state.RemoteEP,

EndReceiveFromCallback,

state);

}

}

///?<summary>

///?向客戶端發送信息

///?</summary>

///?<param?name="socket">本地Socket(服務器Socket)</param>

///?<param?name="remoteEndPoint">客戶端終結點</param>

///?<param?name="Message">信息</param>

static?void?SendMeaage(Socket?socket,?EndPoint?remoteEndPoint,?string?Message)

{

byte[]?bytes?=?Encoding.Default.GetBytes(Message);

socket.SendTo(bytes,?remoteEndPoint);

}

}

///?<summary>

///?用於異步接收處理的輔助類

///?</summary>

class?State

{

public?State(Socket?socket)

{

this.Buffer?=?new?byte[1024];

this.Socket?=?socket;

this.RemoteEP?=?new?IPEndPoint(IPAddress.Any,?0);

}

///?<summary>

///?獲取本機(服務器)Socket

///?</summary>

public?Socket?Socket?{?get;?private?set;?}

///?<summary>

///?獲取接收緩沖區

///?</summary>

public?byte[]?Buffer?{?get;?private?set;?}

///?<summary>

///?獲取/設置客戶端終結點

///?</summary>

public?EndPoint?RemoteEP;

}

}

UDP客戶端

using?System;

using?System.Text;

using?System.Net;

using?System.Net.Sockets;

namespace?ConsoleUdpClient

{

class?Program

{

static?void?Main(string[]?args)

{

Socket?socket?=?new?Socket(AddressFamily.InterNetwork,

SocketType.Dgram,

ProtocolType.Udp);

//客戶端使用的終結點

EndPoint?localEP?=?new?IPEndPoint(IPAddress.Any,?0);

socket.Bind(localEP);

//啟動異步接收

State?state?=?new?State(socket);

socket.BeginReceiveFrom(

state.Buffer,?0,?state.Buffer.Length,

SocketFlags.None,

ref?state.RemoteEP,

EndReceiveFromCallback,

state);

//向服務器發送信息

EndPoint?remoteEP?=?new?IPEndPoint(IPAddress.Parse("127.0.0.1"),?8002);

SendMeaage(socket,?remoteEP,?"妳好,這裏是客戶端,收到請回復!Over~~~~");

Console.ReadLine();

socket.Close();

}

//異步接收回調函數

static?void?EndReceiveFromCallback(IAsyncResult?iar)

{

State?state?=?iar.AsyncState?as?State;

Socket?socket?=?state.Socket;

try

{

//完成接收

int?byteRead?=?socket.EndReceiveFrom(iar,?ref?state.RemoteEP);

//顯示服務器地址和端口

Console.WriteLine("服務器終結點:{0}",?state.RemoteEP.ToString());

//顯示接收信息

Console.WriteLine("接收數據字節數:{0}",?byteRead);

string?message?=?Encoding.Default.GetString(state.Buffer,?0,?byteRead);

Console.WriteLine("來著服務器的信息:{0}",?message);

}

catch?(Exception?e)

{

Console.WriteLine("發生異常!異常信息:");

Console.WriteLine(e.Message);

}

finally

{

//非常重要:繼續異步接收

socket.BeginReceiveFrom(

state.Buffer,?0,?state.Buffer.Length,

SocketFlags.None,

ref?state.RemoteEP,

EndReceiveFromCallback,

state);

}

}

///?<summary>

///?向服務器發送信息

///?</summary>

///?<param?name="socket">本地Socket</param>

///?<param?name="remoteEndPoint">服務器終結點</param>

///?<param?name="Message">信息</param>

static?void?SendMeaage(Socket?socket,?EndPoint?remoteEndPoint,?string?Message)

{

byte[]?bytes?=?Encoding.Default.GetBytes(Message);

socket.SendTo(bytes,?remoteEndPoint);

}

}

///?<summary>

///?用於異步接收處理的輔助類

///?</summary>

class?State

{

public?State(Socket?socket)

{

this.Buffer?=?new?byte[1024];

this.Socket?=?socket;

this.RemoteEP?=?new?IPEndPoint(IPAddress.Any,?0);

}

///?<summary>

///?獲取本機Socket

///?</summary>

public?Socket?Socket?{?get;?private?set;?}

///?<summary>

///?獲取接收緩沖區

///?</summary>

public?byte[]?Buffer?{?get;?private?set;?}

///?<summary>

///?獲取/設置客戶端終結點

///?</summary>

public?EndPoint?RemoteEP;

}

}

  • 上一篇:Microsoft Excel壹打開就提示Microsoft Excel已經停止工作
  • 下一篇:ios14主要有哪些功能
  • copyright 2024編程學習大全網