c#实现简单控制台udp异步通信程序示例
时间:2022-06-13 18:54:38
实现客户端发送请求,服务器端响应机制
UDP客户端代码
using System;
using System.Text;
using System.Net;
using System.Net.Sockets;
namespace Client
{
class Program
{
//客户端 Socket对象
private static Socket clientSocket;
//服务器端 终点
private static EndPoint epServer;
//接收数据的字符数组
private static byte[] receiveData;
public static void Main(string[] args)
{
//客户端Socket对象实例化
clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
//设置服务器端IP地址和对应端口
IPEndPoint server = new IPEndPoint(IPAddress.Parse("192.168.1.165"), 11000);
//实例化服务器端 终点
epServer = (EndPoint)server;
string msg; //要发送的消息
byte[] sendData; //要发送的字符串
while (true) {
msg = Console.ReadLine(); //输入要发送的消息
if (msg == "exit") break; //当输入“exit”时,退出客户端程序
//将消息通过ASCII编码转换为字符数组,
//如果要发送汉字或其他特殊符号,可以采用UTF-8
sendData = Encoding.ASCII.GetBytes(msg);
//开始异步发送消息
//参数:sendData 要发送的数据
//参数:0: 要发送数据的起始位置
//参数:sendData.Length: 要发送数据的字节数
//参数:SocketFlags.None: 按位组合方式
//参数:epServer: 接收方设备(包含IP和端口)
//参数:new AsyncCallback(SendData): 委托
//参数:null: 请求的状态信息
clientSocket.BeginSendTo(sendData, 0, sendData.Length, SocketFlags.None,
epServer, new AsyncCallback(SendData), null);
//实例化接收数据的字符数组
//若在声明时已经初始化,此处依然要进行重新初始化
//当上次接收的数据长度大于本次,则该数组里包含上次接收的残留数据
//比如:上次接收“你个小逗逼”。本次接收“开玩笑”。
//则数组中的数据为:“开玩笑逗逼”。
receiveData = new byte[1024];
//开始异步接收消息
//参数部分与异步发送部分对应,基本一致
clientSocket.BeginReceiveFrom(receiveData, 0, receiveData.Length, SocketFlags.None,
ref epServer, new AsyncCallback(ReceiveData), null);
}
}
//异步发送消息的委托函数
private static void SendData(IAsyncResult iar)
{
//完成异步发送
clientSocket.EndSend(iar);
}
//异步接收消息的委托函数
private static void ReceiveData(IAsyncResult iar)
{
//完成异步接收 recv 表示接收到的字节数
int recv = clientSocket.EndReceive(iar);
//将接收到的数据打印出来
Console.WriteLine("Server: " + Encoding.ASCII.GetString(receiveData, 0, recv));
}
}
}
UDP服务器端代码
using System;
using System.Text;
using System.Net;
using System.Net.Sockets;
namespace Server
{
class AsyncUdpServer
{
//服务器端Socket对象
private static Socket serverSocket;
//接收数据的字符数组
private static byte[] receiveData = new byte[1024];
public static void Main(string[] args)
{
//实例化服务器端Socket对象
serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
//服务器端的IP和端口,IPAddress.Any实际是:0.0.0.0,表示任意,基本上表示本机IP
IPEndPoint server = new IPEndPoint(IPAddress.Any, 11000);
//Socket对象跟服务器端的IP和端口绑定
serverSocket.Bind(server);
//客户端的IP和端口,端口 0 表示任意端口
IPEndPoint clients = new IPEndPoint(IPAddress.Any, 0);
//实例化客户端 终点
EndPoint epSender = (EndPoint)clients;
//开始异步接收消息 接收后,epSender存储的是发送方的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)
{
//客户端的IP和端口,端口 0 表示任意端口
IPEndPoint client = new IPEndPoint(IPAddress.Any, 0);
//实例化客户端 终点
EndPoint epSender = (EndPoint)client;
//结束异步接收消息 recv 表示接收到的字符数
int recv = serverSocket.EndReceiveFrom(iar, ref epSender);
//将接收到的数据打印出来,发送方采用什么编码方式,此处就采用什么编码方式 转换成字符串
Console.WriteLine("Client:" + Encoding.ASCII.GetString(receiveData, 0, recv));
//定义要发送回客户端的消息,采用ASCII编码,
//如果要发送汉字或其他特殊符号,可以采用UTF-8
byte[] sendData = Encoding.ASCII.GetBytes("hello");
//开始异步发送消息 epSender是上次接收消息时的客户端IP和端口信息
serverSocket.BeginSendTo(sendData, 0, sendData.Length, SocketFlags.None,
epSender, new AsyncCallback(SendData), epSender);
//重新实例化接收数据字节数组
receiveData = new byte[1024];
//开始异步接收消息,此处的委托函数是这个函数本身,递归
serverSocket.BeginReceiveFrom(receiveData, 0, receiveData.Length, SocketFlags.None,
ref epSender, new AsyncCallback(ReceiveData), epSender);
}
}
}
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
Flink开发IDEA环境搭建与测试的方法
![](https://img.aspxhome.com/file/2023/0/84270_0s.jpg)
mybatis如何批量添加一对多中间表
![](https://img.aspxhome.com/file/2023/7/72337_0s.png)
Java date format时间格式化操作示例
Java读取TXT文件内容的方法
Android用注解与反射实现Butterknife功能
Java中关键字synchronized的使用方法详解
![](https://img.aspxhome.com/file/2023/8/85828_0s.png)
Android中ListView分页加载数据功能实现
![](https://img.aspxhome.com/file/2023/2/137352_0s.png)
解决BigDecimal转long丢失精度的问题
![](https://img.aspxhome.com/file/2023/2/83582_0s.jpg)
java控制台输出百分比进度条示例
Android中bindService基本使用方法概述
![](https://img.aspxhome.com/file/2023/6/85446_0s.png)
解决使用RestTemplate时报错RestClientException的问题
springboot使用mybatis一对多的关联查询问题记录
![](https://img.aspxhome.com/file/2023/0/72650_0s.png)
Springcloud Nacos基本操作代码实例
![](https://img.aspxhome.com/file/2023/8/61148_0s.png)
Linux下JDK安装教程
![](https://img.aspxhome.com/file/2023/5/81945_0s.png)
Android中如何指定SnackBar在屏幕的位置及小问题解决
详解Java内存泄露的示例代码
Java中包装类介绍与其注意事项
![](https://img.aspxhome.com/file/2023/0/62810_0s.png)
超详细的Java 问题排查工具单
![](https://img.aspxhome.com/file/2023/4/84214_0s.png)
Android自带emoji表情的使用方法详解
![](https://img.aspxhome.com/file/2023/7/94967_0s.png)