同步和异步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. ubuntu16.04+cuda7.5

    0 安装了ubuntu16.04 GT980的显卡,安装了nvidia340的驱动 1 下载cuda7.5的.run文件 2 进入tty1,service stop lightdm 3 sudo sh ...

  2. ubuntu中maven建的web项目不能将project facet设置为 dynamic web module 3.0

    核心参考:maven 不能设置为web3.0人解决方法 error:Description    Resource    Path    Location    Type Cannot change ...

  3. VS2010 asp.net development server 无法展示svg图片

    无解!只能使用IIS Express或者部署到服务器上的IIS能解决! 以下为解释: http://stackoverflow.com/questions/5981309/asp-net-develo ...

  4. Linux 之 编译器 gcc/g++参数详解

    2016年12月9日16:48:53 ----------------------------- 内容目录: [介绍] gcc and g++分别是gnu的c & c++编译器 gcc/g++ ...

  5. Linux下安装py-leveldb

    1.下载源代码 svn checkout http://py-leveldb.googlecode.com/svn/trunk/ py-leveldb-read-only 2.安装辅助工具 sudo ...

  6. hdu 2010 - 水仙花数

    题意: 数学上有个水仙花数,他是这样定义的:"水仙花数"是指一个三位数,它的各位数字的立方和等于其本身,比如:153=1^3+5^3+3^3.现在要求输出所有在m和n范围内的水仙花 ...

  7. UIViewController 的 presentedViewController 和 presentingViewController

    #import "TestViewController.h" #import "OneViewController.h" 在TextViewController ...

  8. 从Paxos到ZooKeeper-二、ZooKeeper和Paxos

    ZooKeeper为分布式应用提供了高效且可靠的分布式协调服务,提供了诸如tong'yi统一命名服务.配置管理和分布式锁等分布式的基础服务.在解决分布式数据一致性方面,ZooKeeper并没有直接采用 ...

  9. 电脑中的Bois是什么

    电脑中的Bois是什么 BOIS= Basic Input/Output System,基本输入输出系统,全称是ROM-BOIS,是只读存储器基本输入/输出系统的简写,它实际是一组被固化到电脑中,为电 ...

  10. Java排序算法——归并排序

    import java.util.Arrays; //================================================= // File Name : MergeSor ...