同步和异步Socket的区别是,同步Socket会阻塞当前进程,而异步Socket则不会。

  首先,一个最简单的同步UDP收发程序实例。可以看到,发送调用Send()函数之后,开始调用Receive接收,这个时候程序会一直在这里等待,直到收到数据。

  

using System;
using System.Net.Sockets;
using System.Net;
using System.Text; public class UdpClientTest
{
public static void Main()
{
UdpClient udpClient = new UdpClient(); //侦听本地端口
IPEndPoint host = new IPEndPoint(IPAddress.Parse("192.168.191.1"),); //这里是目标主机和端口
Byte[] msg = new UTF8Encoding(true).GetBytes("Hee How are U?");
udpClient.Send(msg, msg.Length, host); IPEndPoint remoteHost = new IPEndPoint(IPAddress.Any,);
Byte[] receivedBytes = udpClient.Receive(ref remoteHost);
string returnData = Encoding.ASCII.GetString(receivedBytes);
Console.WriteLine("This is message you received is :"+returnData.ToString());
Console.WriteLine("This is was sent form : "+remoteHost.Address.ToString() + " port number " + remoteHost.Port.ToString()); udpClient.Close();
}
}

  下面是一个异步UDP的实例,

  

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms; using System.Net;
using System.Net.Sockets; namespace Test
{
class UdpServer
{
public Socket serverSocket;
public byte[] dataStream;
public byte[] receivedBytes;
public EndPoint epSender; // 关闭前一个窗口的回调函数
public delegate void OnDataReceived();
public event OnDataReceived onDataReceive; public UdpServer()
{
this.dataStream = new byte[];
} public void Open(int port)
{
this.serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
IPEndPoint serverPoint = new IPEndPoint(IPAddress.Any, port);
this.serverSocket.Bind(serverPoint);
} public void Close()
{
this.serverSocket.Shutdown(SocketShutdown.Both);
this.serverSocket.Close(); this.serverSocket.Shutdown(SocketShutdown.Both);
this.serverSocket.Close();
} public void Listen()
{
try
{
IPEndPoint clientPoint = new IPEndPoint(IPAddress.Any, );
this.epSender = (EndPoint)clientPoint;
this.serverSocket.BeginReceiveFrom(this.dataStream, ,
this.dataStream.Length,
SocketFlags.None,
ref epSender,
new AsyncCallback(ReceiveData),
epSender);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "UDP连接创建失败", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
} private void ReceiveData(IAsyncResult asyncResult)
{
try
{
int recv_len = serverSocket.EndReceiveFrom(asyncResult, ref epSender);
this.serverSocket.BeginReceiveFrom(this.dataStream, ,
this.dataStream.Length,
SocketFlags.None,
ref epSender,
new AsyncCallback(ReceiveData),
epSender); receivedBytes = new byte[recv_len];
Array.Copy(dataStream, , receivedBytes,,recv_len); Console.WriteLine("got "+recv_len.ToString() + " Bytes");
Console.WriteLine("str is: "+ Encoding.ASCII.GetString(dataStream,,recv_len)); onDataReceive();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "UDP接收异常", MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
} /*
public void SendTo(IPEndPoint dstEndPoint, byte[] byteData,int length) {
EndPoint dstHost = (EndPoint)dstEndPoint;
// Begin sending the data to the remote device.
this.serverSocket.BeginSendTo(byteData, 0, length,
SocketFlags.None, dstHost,
new AsyncCallback(SendCallback), this.serverSocket);
}*/ private void SendTo(IPEndPoint dstEndPoint, string text) {
byte[] byteData = Encoding.ASCII.GetBytes(text);
EndPoint dstHost = (EndPoint)dstEndPoint;
// Begin sending the data to the remote device.
this.serverSocket.BeginSendTo(byteData, , byteData.Length,
SocketFlags.None, dstHost,
new AsyncCallback(SendCallback), this.serverSocket);
} private void SendCallback(IAsyncResult ar) {
try {
// Retrieve the socket from the state object.
Socket handler = (Socket) ar.AsyncState; // Complete sending the data to the remote device.
int bytesSent = handler.EndSend(ar);
Console.WriteLine("Sent {0} bytes to client.", bytesSent); //handler.Shutdown(SocketShutdown.Both);
//handler.Close(); } catch (Exception ex) {
MessageBox.Show(ex.Message, "UDP发送异常", MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
} public static void Main()
{
IPEndPoint dstPoint = new IPEndPoint(IPAddress.Parse("192.168.65.230"),);//发送到本地7000端口
UdpServer udpServer = new UdpServer();
udpServer.Open(); //本地侦听6000端口
udpServer.Listen();
udpServer.SendTo(dstPoint, "Hello World!!!"); while(true)
{ }
}
}
}

同步和异步UDP使用方法的更多相关文章

  1. C#完整的通信代码(点对点,点对多,同步,异步,UDP,TCP)

    C# code namespace UDPServer { class Program { static void Main(string[] args) { int recv; byte[] dat ...

  2. udp协议,进程(同步,异步)

    udp协议与进程 一.udp协议 QQ聊天室 #- sever import socket #socket.SOCK_DGRAM--->UPD协议 sever = socket.socket(t ...

  3. UDP协议、操作系统、同步与异步、阻塞与非阻塞

    UDP协议 # 客户端 import socket server = socket.socket(type=socket.SOCK_DGRAM) server.bind(('127.0.0.1', 8 ...

  4. UDP协议,多道技术,进程,同步与异步,阻塞与非阻塞

    UDP协议 简介 UDP叫做用户数据报协议,是OSI七层参考模型中传输层使用的协议,他提供的是不可靠传输,既它在传输过程 中不保证数据的完整性! 端口号 UDP使用IP地址和端口号进行标识,以此将数据 ...

  5. C#的同步和异步调用方法

    同步和异步大家都明白什么意思,在这里不多介绍了. namespace ConsoleTest { class Program { static void Main(string[] args) { C ...

  6. 分布式缓存系统 Memcached 半同步/半异步模式

    在前面工作线程初始化的分析中讲到Memcached采用典型的Master_Worker模式,也即半同步/半异步的高效网络并发模式.其中主线程(异步线程)负责接收客户端连接,然后分发给工作线程,具体由工 ...

  7. 【python】-- 事件驱动介绍、阻塞IO, 非阻塞IO, 同步IO,异步IO介绍

    事件驱动介绍 一.前言 通常,我们写服务器处理模型的程序时,有以下几种模型: (1)每收到一个请求,创建一个新的进程,来处理该请求: (2)每收到一个请求,创建一个新的线程,来处理该请求: (3)每收 ...

  8. .NET同步与异步之相关背景知识(六)

    在之前的五篇随笔中,已经介绍了.NET 类库中实现并行的常见方式及其基本用法,当然.这些基本用法远远不能覆盖所有,也只能作为一个引子出现在这里.以下是前五篇随笔的目录: .NET 同步与异步之封装成T ...

  9. 同步与异步 & 阻塞与非阻塞

    在进行网络编程时,我们常常见到同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式: 一.同步 所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用 ...

随机推荐

  1. 【poj1177】 Picture

    http://poj.org/problem?id=1177 (题目链接) 题意 求矩形周长并. Solution 转自:http://www.cnblogs.com/Booble/archive/2 ...

  2. 树莓派启用root账户

    树莓派使用的linux是debian系统,所以树莓派启用root和debian是相同的. debian里root账户默认没有密码,但账户锁定. 当需要root权限时, 直接执行 sudo su 即可切 ...

  3. C++开发的基于UDP协议的聊天工具

    项目相关地址 源码:https://github.com/easonjim/UDPChat bug提交:https://github.com/easonjim/UDPChat/issues

  4. NuGet在Push的时候提示“远程服务器返回错误:(403)已禁用”问题解决

    在使用NuGet把包push到nuget官网的时候,提示了如下信息: Failed to process request. 'The specified API key is invalid or d ...

  5. [NOIP2012] 提高组 洛谷P1081 开车旅行

    题目描述 小 A 和小 B 决定利用假期外出旅行,他们将想去的城市从 1 到 N 编号,且编号较小的 城市在编号较大的城市的西边,已知各个城市的海拔高度互不相同,记城市 i 的海拔高度为 Hi,城市 ...

  6. Google的Java开发规范

    长期以来,Google一直有针对各种语言的规范,例如C++, Python等等.惟独对于Java语言,Google一直没有给出相应的规范(传说中是因为Google Java首席构架师Joshua Bl ...

  7. python *args **kwargs

    简单来说,当你传入的参数不能确定是几个的时候会用到 *args和**kwargs,这里星号后边只是个代号,你写成a也可以. 而这两者的区别是 如果是键值对就要用后者,反之前者就可以. 同时还可以用(a ...

  8. NSClassFromString 和 遍历UIView获取她所在的UIViewController的tips

    一.NSClassFromString是NSObjCRuntime.h的方法 FOUNDATION_EXPORT Class __nullable NSClassFromString(NSString ...

  9. POJ 3678 Katu Puzzle(强连通 法)

    题目链接 题意:给出a, b, c 和操作类型 (与或异或),问是否满足所有的式子 主要是建图: 对于 and , c == 1: 说明 a 和 b都是1,那么 0 就不能取, a' -> a ...

  10. Android Studio MultiDex 分包碰到的坑

    前天准备发包了,测试完毕,打好正式签名包,装到手机上,运行不起来. 网上查了大量资料,都没有解决方案. log显示如下: 04-26 10:07:57.727 1538-1538/? I/MultiD ...