同步和异步UDP使用方法
同步和异步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使用方法的更多相关文章
- C#完整的通信代码(点对点,点对多,同步,异步,UDP,TCP)
C# code namespace UDPServer { class Program { static void Main(string[] args) { int recv; byte[] dat ...
- udp协议,进程(同步,异步)
udp协议与进程 一.udp协议 QQ聊天室 #- sever import socket #socket.SOCK_DGRAM--->UPD协议 sever = socket.socket(t ...
- UDP协议、操作系统、同步与异步、阻塞与非阻塞
UDP协议 # 客户端 import socket server = socket.socket(type=socket.SOCK_DGRAM) server.bind(('127.0.0.1', 8 ...
- UDP协议,多道技术,进程,同步与异步,阻塞与非阻塞
UDP协议 简介 UDP叫做用户数据报协议,是OSI七层参考模型中传输层使用的协议,他提供的是不可靠传输,既它在传输过程 中不保证数据的完整性! 端口号 UDP使用IP地址和端口号进行标识,以此将数据 ...
- C#的同步和异步调用方法
同步和异步大家都明白什么意思,在这里不多介绍了. namespace ConsoleTest { class Program { static void Main(string[] args) { C ...
- 分布式缓存系统 Memcached 半同步/半异步模式
在前面工作线程初始化的分析中讲到Memcached采用典型的Master_Worker模式,也即半同步/半异步的高效网络并发模式.其中主线程(异步线程)负责接收客户端连接,然后分发给工作线程,具体由工 ...
- 【python】-- 事件驱动介绍、阻塞IO, 非阻塞IO, 同步IO,异步IO介绍
事件驱动介绍 一.前言 通常,我们写服务器处理模型的程序时,有以下几种模型: (1)每收到一个请求,创建一个新的进程,来处理该请求: (2)每收到一个请求,创建一个新的线程,来处理该请求: (3)每收 ...
- .NET同步与异步之相关背景知识(六)
在之前的五篇随笔中,已经介绍了.NET 类库中实现并行的常见方式及其基本用法,当然.这些基本用法远远不能覆盖所有,也只能作为一个引子出现在这里.以下是前五篇随笔的目录: .NET 同步与异步之封装成T ...
- 同步与异步 & 阻塞与非阻塞
在进行网络编程时,我们常常见到同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式: 一.同步 所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用 ...
随机推荐
- 2.头文件<bits/stdc++.h>
用这种方法声明头文件只需两行代码 #include<bits/stdc++.h> using namespace std; 这个头文件包含以下等等C++中包含的所有头文件: #inclu ...
- ConurrentHashMap和Hashtable的区别
转自:http://www.importnew.com/7166.html 集合类是Java API的核心,但是我觉得要用好它们是一种艺术.我总结了一些个人的经验,譬如使用ArrayList能够提高性 ...
- 高可用与负载均衡(8)之聊聊 LVS重要参数和优化以及监控
preface 在明白LVS-DR模式的部署之后,我们看看LVS的几个重要参数: 如有问题,请联系我18500777133@sina.cn [root@localhost ~]# ls /proc/s ...
- POJ2185Milking Grid(最小覆盖子串 + 二维KMP)
题意: 一个r*c的矩形,求一个子矩形通过平移复制能覆盖整个矩形 关于一个字符串的最小覆盖子串可以看这里http://blog.csdn.net/fjsd155/article/details/686 ...
- POJ1144Network(求割点个数)
题目链接 题意:一共n割点,然后若干行,每行第一个输入一个点,然后若干个点表示与他相连,0单独一行表示一个样例的结束.然后求图中的割点个数 割点:去掉该点之后得到的图不在连通,那么该店就是割点 一般割 ...
- C#调用WebService实现天气预报
http://zhangkui.blog.51cto.com/1796259/497324/ 本文使用Winform (C#)调用互联网上公开的WebServices(http://www.webxm ...
- [EmguCV|WinForm] 使用EmguCV內建直方圖工具繪製直方圖(Histogram)-直方圖(Histogram)系列 (1)
https://dotblogs.com.tw/v6610688/archive/2013/12/20/emgucv_draw_histogram_histogrambox_histogramview ...
- JAVA通过md5方法进行加密
import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; /* * MD5 算法 * */ ...
- 将文件路径以"\"隔开
将文件路径以"\"隔开,这货搞了我一小时...C++返回一维数组,字符串数组还是要再看看 ]) { ; //string s_array[30]; //局部变量,如果使用retur ...
- maven学习讲解
参考链接:http://www.cnblogs.com/bigtall/archive/2011/03/23/1993253.html 1.前言 Maven,发音是[`meivin],"专家 ...