c#實(shí)現(xiàn)簡(jiǎn)單控制臺(tái)udp異步通信程序示例
實(shí)現(xiàn)客戶(hù)端發(fā)送請(qǐng)求,服務(wù)器端響應(yīng)機(jī)制
UDP客戶(hù)端代碼
using System;
using System.Text;
using System.Net;
using System.Net.Sockets;
namespace Client
{
class Program
{
//客戶(hù)端 Socket對(duì)象
private static Socket clientSocket;
//服務(wù)器端 終點(diǎn)
private static EndPoint epServer;
//接收數(shù)據(jù)的字符數(shù)組
private static byte[] receiveData;
public static void Main(string[] args)
{
//客戶(hù)端Socket對(duì)象實(shí)例化
clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
//設(shè)置服務(wù)器端IP地址和對(duì)應(yīng)端口
IPEndPoint server = new IPEndPoint(IPAddress.Parse("192.168.1.165"), 11000);
//實(shí)例化服務(wù)器端 終點(diǎn)
epServer = (EndPoint)server;
string msg; //要發(fā)送的消息
byte[] sendData; //要發(fā)送的字符串
while (true) {
msg = Console.ReadLine(); //輸入要發(fā)送的消息
if (msg == "exit") break; //當(dāng)輸入“exit”時(shí),退出客戶(hù)端程序
//將消息通過(guò)ASCII編碼轉(zhuǎn)換為字符數(shù)組,
//如果要發(fā)送漢字或其他特殊符號(hào),可以采用UTF-8
sendData = Encoding.ASCII.GetBytes(msg);
//開(kāi)始異步發(fā)送消息
//參數(shù):sendData 要發(fā)送的數(shù)據(jù)
//參數(shù):0: 要發(fā)送數(shù)據(jù)的起始位置
//參數(shù):sendData.Length: 要發(fā)送數(shù)據(jù)的字節(jié)數(shù)
//參數(shù):SocketFlags.None: 按位組合方式
//參數(shù):epServer: 接收方設(shè)備(包含IP和端口)
//參數(shù):new AsyncCallback(SendData): 委托
//參數(shù):null: 請(qǐng)求的狀態(tài)信息
clientSocket.BeginSendTo(sendData, 0, sendData.Length, SocketFlags.None,
epServer, new AsyncCallback(SendData), null);
//實(shí)例化接收數(shù)據(jù)的字符數(shù)組
//若在聲明時(shí)已經(jīng)初始化,此處依然要進(jìn)行重新初始化
//當(dāng)上次接收的數(shù)據(jù)長(zhǎng)度大于本次,則該數(shù)組里包含上次接收的殘留數(shù)據(jù)
//比如:上次接收“你個(gè)小逗逼”。本次接收“開(kāi)玩笑”。
//則數(shù)組中的數(shù)據(jù)為:“開(kāi)玩笑逗逼”。
receiveData = new byte[1024];
//開(kāi)始異步接收消息
//參數(shù)部分與異步發(fā)送部分對(duì)應(yīng),基本一致
clientSocket.BeginReceiveFrom(receiveData, 0, receiveData.Length, SocketFlags.None,
ref epServer, new AsyncCallback(ReceiveData), null);
}
}
//異步發(fā)送消息的委托函數(shù)
private static void SendData(IAsyncResult iar)
{
//完成異步發(fā)送
clientSocket.EndSend(iar);
}
//異步接收消息的委托函數(shù)
private static void ReceiveData(IAsyncResult iar)
{
//完成異步接收 recv 表示接收到的字節(jié)數(shù)
int recv = clientSocket.EndReceive(iar);
//將接收到的數(shù)據(jù)打印出來(lái)
Console.WriteLine("Server: " + Encoding.ASCII.GetString(receiveData, 0, recv));
}
}
}
UDP服務(wù)器端代碼
using System;
using System.Text;
using System.Net;
using System.Net.Sockets;
namespace Server
{
class AsyncUdpServer
{
//服務(wù)器端Socket對(duì)象
private static Socket serverSocket;
//接收數(shù)據(jù)的字符數(shù)組
private static byte[] receiveData = new byte[1024];
public static void Main(string[] args)
{
//實(shí)例化服務(wù)器端Socket對(duì)象
serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
//服務(wù)器端的IP和端口,IPAddress.Any實(shí)際是:0.0.0.0,表示任意,基本上表示本機(jī)IP
IPEndPoint server = new IPEndPoint(IPAddress.Any, 11000);
//Socket對(duì)象跟服務(wù)器端的IP和端口綁定
serverSocket.Bind(server);
//客戶(hù)端的IP和端口,端口 0 表示任意端口
IPEndPoint clients = new IPEndPoint(IPAddress.Any, 0);
//實(shí)例化客戶(hù)端 終點(diǎn)
EndPoint epSender = (EndPoint)clients;
//開(kāi)始異步接收消息 接收后,epSender存儲(chǔ)的是發(fā)送方的IP和端口
serverSocket.BeginReceiveFrom(receiveData, 0, receiveData.Length, SocketFlags.None,
ref epSender, new AsyncCallback(ReceiveData), epSender);
Console.WriteLine("Listening...");
Console.ReadLine();
}
private static void SendData(IAsyncResult iar)
{
serverSocket.EndSend(iar);
}
private static void ReceiveData(IAsyncResult iar)
{
//客戶(hù)端的IP和端口,端口 0 表示任意端口
IPEndPoint client = new IPEndPoint(IPAddress.Any, 0);
//實(shí)例化客戶(hù)端 終點(diǎn)
EndPoint epSender = (EndPoint)client;
//結(jié)束異步接收消息 recv 表示接收到的字符數(shù)
int recv = serverSocket.EndReceiveFrom(iar, ref epSender);
//將接收到的數(shù)據(jù)打印出來(lái),發(fā)送方采用什么編碼方式,此處就采用什么編碼方式 轉(zhuǎn)換成字符串
Console.WriteLine("Client:" + Encoding.ASCII.GetString(receiveData, 0, recv));
//定義要發(fā)送回客戶(hù)端的消息,采用ASCII編碼,
//如果要發(fā)送漢字或其他特殊符號(hào),可以采用UTF-8
byte[] sendData = Encoding.ASCII.GetBytes("hello");
//開(kāi)始異步發(fā)送消息 epSender是上次接收消息時(shí)的客戶(hù)端IP和端口信息
serverSocket.BeginSendTo(sendData, 0, sendData.Length, SocketFlags.None,
epSender, new AsyncCallback(SendData), epSender);
//重新實(shí)例化接收數(shù)據(jù)字節(jié)數(shù)組
receiveData = new byte[1024];
//開(kāi)始異步接收消息,此處的委托函數(shù)是這個(gè)函數(shù)本身,遞歸
serverSocket.BeginReceiveFrom(receiveData, 0, receiveData.Length, SocketFlags.None,
ref epSender, new AsyncCallback(ReceiveData), epSender);
}
}
}
相關(guān)文章
C#操作SQLite數(shù)據(jù)庫(kù)方法小結(jié)(創(chuàng)建,連接,插入,查詢(xún),刪除等)
這篇文章主要介紹了C#操作SQLite數(shù)據(jù)庫(kù)方法,包括針對(duì)SQLite數(shù)據(jù)庫(kù)的創(chuàng)建,連接,插入,查詢(xún),刪除等操作,并提供了一個(gè)SQLite的封裝類(lèi),需要的朋友可以參考下2016-07-07C# ManagementObjectSearcher操作window案例詳解
這篇文章主要介紹了C# ManagementObjectSearcher操作window案例詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08數(shù)字金額大寫(xiě)轉(zhuǎn)換器制作代碼分享(人民幣大寫(xiě)轉(zhuǎn)換)
一個(gè)人民幣大寫(xiě)的擴(kuò)展方法,可以做成數(shù)字金額大寫(xiě)轉(zhuǎn)換器,大家參考使用吧2013-12-12C#中序列化實(shí)現(xiàn)深拷貝,實(shí)現(xiàn)DataGridView初始化刷新的方法
下面小編就為大家?guī)?lái)一篇C#中序列化實(shí)現(xiàn)深拷貝,實(shí)現(xiàn)DataGridView初始化刷新的方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-02-02C#判斷一個(gè)字符串是否包含另一個(gè)字符串的方法
這篇文章主要介紹了C#判斷一個(gè)字符串是否包含另一個(gè)字符串的方法,涉及C#中IndexOf方法的使用技巧,非常簡(jiǎn)單實(shí)用,需要的朋友可以參考下2015-04-04