UDP异步通信C#
来源:互联网 发布:三丰cmm编程视频 编辑:程序博客网 时间:2024/05/19 05:39
C# 编写的简单UDP异步通信程序(控制台)
客户端发送请求,服务器端响应机制
1. [代码]UDP客户端代码
01
using
System;
02
using
System.Text;
03
using
System.Net;
04
using
System.Net.Sockets;
05
06
namespace
Client
07
{
08
class
Program
09
{
10
//客户端 Socket对象
11
private
static
Socket clientSocket;
12
//服务器端 终点
13
private
static
EndPoint epServer;
14
//接收数据的字符数组
15
private
static
byte
[] receiveData;
16
17
public
static
void
Main(
string
[] args)
18
{
19
//客户端Socket对象实例化
20
clientSocket =
new
Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
21
//设置服务器端IP地址和对应端口
22
IPEndPoint server =
new
IPEndPoint(IPAddress.Parse(
"192.168.1.165"
), 11000);
23
//实例化服务器端 终点
24
epServer = (EndPoint)server;
25
string
msg;
//要发送的消息
26
byte
[] sendData;
//要发送的字符串
27
while
(
true
) {
28
msg = Console.ReadLine();
//输入要发送的消息
29
if
(msg ==
"exit"
)
break
;
//当输入“exit”时,退出客户端程序
30
//将消息通过ASCII编码转换为字符数组,
31
//如果要发送汉字或其他特殊符号,可以采用UTF-8
32
sendData = Encoding.ASCII.GetBytes(msg);
33
//开始异步发送消息
34
//参数:sendData 要发送的数据
35
//参数:0: 要发送数据的起始位置
36
//参数:sendData.Length: 要发送数据的字节数
37
//参数:SocketFlags.None: 按位组合方式
38
//参数:epServer: 接收方设备(包含IP和端口)
39
//参数:new AsyncCallback(SendData): 委托
40
//参数:null: 请求的状态信息
41
clientSocket.BeginSendTo(sendData, 0, sendData.Length, SocketFlags.None,
42
epServer,
new
AsyncCallback(SendData),
null
);
43
//实例化接收数据的字符数组
44
//若在声明时已经初始化,此处依然要进行重新初始化
45
//当上次接收的数据长度大于本次,则该数组里包含上次接收的残留数据
46
//比如:上次接收“你个小逗逼”。本次接收“开玩笑”。
47
//则数组中的数据为:“开玩笑逗逼”。
48
receiveData =
new
byte
[1024];
49
//开始异步接收消息
50
//参数部分与异步发送部分对应,基本一致
51
clientSocket.BeginReceiveFrom(receiveData, 0, receiveData.Length, SocketFlags.None,
52
ref
epServer,
new
AsyncCallback(ReceiveData),
null
);
53
}
54
}
55
56
//异步发送消息的委托函数
57
private
static
void
SendData(IAsyncResult iar)
58
{
59
//完成异步发送
60
clientSocket.EndSend(iar);
61
}
62
63
//异步接收消息的委托函数
64
private
static
void
ReceiveData(IAsyncResult iar)
65
{
66
//完成异步接收 recv 表示接收到的字节数
67
int
recv = clientSocket.EndReceive(iar);
68
//将接收到的数据打印出来
69
Console.WriteLine(
"Server: "
+ Encoding.ASCII.GetString(receiveData, 0, recv));
70
}
71
72
}
73
}
2. [代码]UDP服务器端代码
01
using
System;
02
using
System.Text;
03
using
System.Net;
04
using
System.Net.Sockets;
05
06
namespace
Server
07
{
08
class
AsyncUdpServer
09
{
10
//服务器端Socket对象
11
private
static
Socket serverSocket;
12
//接收数据的字符数组
13
private
static
byte
[] receiveData =
new
byte
[1024];
14
15
public
static
void
Main(
string
[] args)
16
{
17
//实例化服务器端Socket对象
18
serverSocket =
new
Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
19
//服务器端的IP和端口,IPAddress.Any实际是:0.0.0.0,表示任意,基本上表示本机IP
20
IPEndPoint server =
new
IPEndPoint(IPAddress.Any, 11000);
21
//Socket对象跟服务器端的IP和端口绑定
22
serverSocket.Bind(server);
23
//客户端的IP和端口,端口 0 表示任意端口
24
IPEndPoint clients =
new
IPEndPoint(IPAddress.Any, 0);
25
//实例化客户端 终点
26
EndPoint epSender = (EndPoint)clients;
27
//开始异步接收消息 接收后,epSender存储的是发送方的IP和端口
28
serverSocket.BeginReceiveFrom(receiveData, 0, receiveData.Length, SocketFlags.None,
29
ref
epSender,
new
AsyncCallback(ReceiveData), epSender);
30
Console.WriteLine(
"Listening..."
);
31
Console.ReadLine();
32
}
33
34
private
static
void
SendData(IAsyncResult iar)
35
{
36
serverSocket.EndSend(iar);
37
}
38
39
private
static
void
ReceiveData(IAsyncResult iar)
40
{
41
//客户端的IP和端口,端口 0 表示任意端口
42
IPEndPoint client =
new
IPEndPoint(IPAddress.Any, 0);
43
//实例化客户端 终点
44
EndPoint epSender = (EndPoint)client;
45
//结束异步接收消息 recv 表示接收到的字符数
46
int
recv = serverSocket.EndReceiveFrom(iar,
ref
epSender);
47
//将接收到的数据打印出来,发送方采用什么编码方式,此处就采用什么编码方式 转换成字符串
48
Console.WriteLine(
"Client:"
+ Encoding.ASCII.GetString(receiveData, 0, recv));
49
//定义要发送回客户端的消息,采用ASCII编码,
50
//如果要发送汉字或其他特殊符号,可以采用UTF-8
51
byte
[] sendData = Encoding.ASCII.GetBytes(
"hello"
);
52
//开始异步发送消息 epSender是上次接收消息时的客户端IP和端口信息
53
serverSocket.BeginSendTo(sendData, 0, sendData.Length, SocketFlags.None,
54
epSender,
new
AsyncCallback(SendData), epSender);
55
//重新实例化接收数据字节数组
56
receiveData =
new
byte
[1024];
57
//开始异步接收消息,此处的委托函数是这个函数本身,递归
58
serverSocket.BeginReceiveFrom(receiveData, 0, receiveData.Length, SocketFlags.None,
59
ref
epSender,
new
AsyncCallback(ReceiveData), epSender);
60
}
61
62
}
63
}
0 0
- C#异步UDP通信
- C#异步UDP通信
- c#异步UDP通信
- UDP异步通信C#
- C# 异步UDP通讯
- C# UDP通信|C#的UDP通信|c# udp 广播
- 一个UDP异步通信例子
- C# udp 通信 例子
- C# UDP通信
- C#实现UDP通信
- UDP通信编程------利用CAsyncSock类实现UDP异步通信
- C# Socket异步通信
- C# Socket异步通信
- C# Socket异步通信
- C# Socket异步通信
- C#完整的通信代码(点对点,点对多,同步,异步,UDP,TCP)
- C#完整的通信代码(一)(点对点,点对多,同步,异步,UDP,TCP)
- C#完整的通信代码(二)(点对点,点对多,同步,异步,UDP,TCP)
- Android Studio汉化工具(首发)---让AS简单易使用
- 20140415关于民委项目思考
- SQL Server 2005 镜像构建手册
- Nginx和PHP-FPM的启动/重启脚本
- Unity 用户手册iOS 开发入门iOS 功用优化运用内置分析器测定功用
- UDP异步通信C#
- Linux下github的配置
- 怎样将一个数据库里的所有数据表的名字绑定到ComboBox中
- 【分享】两会微博讨论
- 为什么对象被new 以后在执行dup操作?
- 推荐一个博文,适合图像处理初学者
- pl/sql中文显示为乱码
- 三层架构的初步了解
- 模式识别 - 恐怖视频特征训练器 部分实现