同步和异步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. 【BZOJ-3626】LCA 树链剖分

    3626: [LNOI2014]LCA Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1428  Solved: 526[Submit][Status ...

  2. [NOIP2014] 提高组 洛谷P1328 生活大爆炸版石头剪刀布

    题目描述 石头剪刀布是常见的猜拳游戏:石头胜剪刀,剪刀胜布,布胜石头.如果两个人出拳一样,则不分胜负.在<生活大爆炸>第二季第8 集中出现了一种石头剪刀布的升级版游戏. 升级版游戏在传统的 ...

  3. AngularJs ngChange、ngChecked、ngClick、ngDblclick

    ngChange 当用户更改输入时,执行给定的表达式.表达式是立即进行执行的,这个和javascript的onChange事件的只有在触发事件的变化结束的时候执行不同. 格式:ng-change=”v ...

  4. 【Alpha版本】 第八天 11.16

    一.站立式会议照片: 二.项目燃尽图: 三.项目进展: 成 员 昨天完成任务 今天完成任务 明天要做任务 问题困难 心得体会 胡泽善 完成我要应聘的列表显示,完成账户信息设置界面 完成我要应聘的详情显 ...

  5. BZOJ2002 [Hnoi2010]Bounce 弹飞绵羊

    传送门 Link-Cut-Tree套路题 //BZOJ 2002 //by Cydiater //2016.9.12 #include <iostream> #include <cs ...

  6. RMQ模板

    RMQ:范围最小值问题.给出一个n个元素的数组A1,A2,...,An,设计一个数据结构支持查询操作Query(L,R):计算min{AL,AL+1,...,AR}. 每次用一个循环来求最小值显然不够 ...

  7. 机器学习笔记----- ID3算法的python实战

    本文申明:本文原创,如有转载请申明.数据代码来自实验数据都是来自[美]Peter Harrington 写的<Machine Learning in Action>这本书,侵删. Hell ...

  8. Python 培训之MySql

    1. Install  1.1 install mysql sudo apt-get install lamp-server^ (tip: Set password) 1.2 install MySQ ...

  9. BZOJ2286: [Sdoi2011]消耗战

    建出虚树dp. 把询问点按dfs序排序,用一个以dfs序为关键字的单调栈(以深度为关键字也是一样的),每次将一个询问点与栈顶的点的lca入栈,再将这个询问点入栈,在这个过程中建出一棵树就是虚树.具体看 ...

  10. SQL语句注入

    1:       select *from user where username='admin' and password='123456'  or 1='1';    万能密码 2:       ...