C#的Socket实现UDP协议通信
今天稍花化了一点时间,利用C#的Socket验证了UDP的通信,为接下来特地利用UDP做个分布式的通信仿真系统打下基础。众所周知,UDP 就是用户数据报协议,在互联网参考模型的第四层——传输层。与TCP协议同层,都是提供信息的传输服务,但与TCP最大区别就是,它是一种无连接不可靠的信息传输。
什么是无连接不可靠?直白点讲就是,发送数据的时候,直接把UDP包往网络一扔就完事了,接不接受收到发送的就不理了;接受数据的时候,有发给本地的UDP包就照单全收,收完再看是谁发的。相比TCP,少了握手建立连接,维护连接,连接释放等一系列过程,因此具有很小的资源消耗和处理速度快的优点。
好了说了一堆废话,开始讲怎么利用C#中Socket进行UDP通信。TCP、UDP应用程序可以通过TCPClient、TCPListener 和 UDPClient 类进行编程,而这些协议类也建立在System.Net.Sockets.Socket 类的基础上,并无需理会数据传送的细节。但为了更好地理解Socket编程,这里还是利用了Socket类进行UDP通信编程。
UDP应用上已经无严格意义上的真正的服务器和客户端之分了,端点之间都是平等的关系,因此进行通信只需编写一个程序即可。
下面给出关键部分代码与说明:
private IPEndPoint ipLocalPoint;
private EndPoint RemotePoint;
private Socket mySocket;
private bool RunningFlag = false;
关键的全局变量
private string getIPAddress()
{
// 获得本机局域网IP地址
IPAddress[] AddressList = Dns.GetHostByName(Dns.GetHostName()).AddressList;
if (AddressList.Length < )
{
return "";
}
return AddressList[].ToString();
}
获取本地IP的方法
private int getValidPort(string port)
{
int lport;
//测试端口号是否有效
try
{
//是否为空
if (port == "")
{
throw new ArgumentException(
"端口号无效,不能启动DUP");
}
lport = System.Convert.ToInt32(port);
}
catch (Exception e)
{
//ArgumentException,
//FormatException,
//OverflowException
Console.WriteLine("无效的端口号:" + e.ToString());
this.tbMsg.AppendText("无效的端口号:" + e.ToString() + "\n");
return -;
}
return lport;
} private IPAddress getValidIP(string ip)
{
IPAddress lip = null;
//测试IP是否有效
try
{
//是否为空
if (!IPAddress.TryParse(ip, out lip))
{
throw new ArgumentException(
"IP无效,不能启动DUP");
}
}
catch (Exception e)
{
//ArgumentException,
//FormatException,
//OverflowException
Console.WriteLine("无效的IP:" + e.ToString());
this.tbMsg.AppendText("无效的IP:" + e.ToString() + "\n");
return null;
}
return lip;
}
IP与端口号有效验证
//得到本机IP,设置UDP端口号
ip = getValidIP(tbLocalIP.Text);
port = getValidPort(tbLocalPort.Text);
ipLocalPoint = new IPEndPoint(ip, port); //定义网络类型,数据连接类型和网络协议UDP
mySocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); //绑定网络地址
mySocket.Bind(ipLocalPoint); //得到客户机IP
ip = getValidIP(tbRemoteIP.Text);
port = getValidPort(tbRemotePort.Text);
IPEndPoint ipep = new IPEndPoint(ip, port);
RemotePoint = (EndPoint)(ipep); //启动一个新的线程,执行方法this.ReceiveHandle,
//以便在一个独立的进程中执行数据接收的操作 RunningFlag = true;
Thread thread = new Thread(new ThreadStart(this.ReceiveHandle));
thread.Start();
Socket的配置
SEO:http://greatverve.cnblogs.com/archive/2011/06/26/Socket-UDP.html
//定义一个委托
public delegate void MyInvoke(string strRecv);
private void ReceiveHandle()
{
//接收数据处理线程
string msg;
byte[] data=new byte[];
MyInvoke myI = new MyInvoke(UpdateMsgTextBox);
while (RunningFlag)
{ if (mySocket == null || mySocket.Available < )
{
Thread.Sleep();
continue;
}
//跨线程调用控件
//接收UDP数据报,引用参数RemotePoint获得源地址
int rlen = mySocket.ReceiveFrom(data, ref RemotePoint);
msg = Encoding.Default.GetString(data, , rlen);
tbMsg.BeginInvoke(myI, new object[]{RemotePoint.ToString() + " : " + msg}); }
}
private void btSend_Click(object sender, EventArgs e)
{
string msg;
msg = tbSendMsg.Text;
//发送UDP数据包
byte[] data = Encoding.Default.GetBytes(msg);
mySocket.SendTo(data, data.Length, SocketFlags.None, RemotePoint);
}
private void UpdateMsgTextBox(string msg)
{
//接收数据显示
this.tbMsg.AppendText( msg + "\n");
}
接收线程
以上只需设置好本地和远程的IP和端口号,很容易就实现了UDP的双向通信。虽说UDP数据包不能保证可靠传输,网络繁忙、拥塞等因素,都有可能阻止数据包到达指定的目的地。但经过测试,其通信还蛮可靠的,别忘了QQ也是利用UDP进行即时通信的。
摘自:http://www.cnblogs.com/greatverve/archive/2011/06/26/Socket-UDP.html
C#的Socket实现UDP协议通信的更多相关文章
- Learning-Python【30】:基于UDP协议通信的套接字
UDP协议没有粘包问题,但是缓冲区大小要足够装数据包大小,建议不要超过 512 服务端: # 服务端 import socket server = socket.socket(socket.AF_IN ...
- python网络编程(通过tcp或者udp协议通信)
1.基于tcp协议传送文件: 客户端: import socketimport osimport jsonimport structclient = socket.socket()client.con ...
- socket之UDP协议,并发编程介绍,操作系统发展史
socket之UDP协议 1.UDP协议 UDP 是User Datagram Protocol的简称, 中文名是用户数据报协议,是OSI(Open System Interconnection 参考 ...
- Socket的UDP协议在erlang中的实现
现在我们看看UDP协议(User Datagram Protocol,用户数据报协议).使用UDP,互联网上的机器之间可以互相发送小段的数据,叫做数据报.UDP数据报是不可靠的,这意味着如果客户端发送 ...
- 网络Socket编程UDP协议例子
服务端代码 public class UDPChatServer { //通讯端口 private Integer port=8000; //数据报文的通讯通道对象 private DatagramC ...
- Java的socket服务UDP协议
练习1 接收类 package com.socket.demo; import java.io.IOException; import java.net.DatagramPacket; import ...
- 通过socket和Udp协议简单实现一个群体聊天工具(控制台)
编写一个聊天程序.有收数据的部分 和 发数据的部分.这两个部分需要同时执行,这就用到多线程技术,一个线程负责收,一个现象负责发. 因为收和发动作是不一致的,所以要定义两个run方法而且这两个方法要封装 ...
- Python进阶----UDP协议使用socket通信,socketserver模块实现并发
Python进阶----UDP协议使用socket通信,socketserver模块实现并发 一丶基于UDP协议的socket 实现UDP协议传输数据 代码如下:
- 基于TCP与UDP协议的socket通信
基于TCP与UDP协议的socket通信 C/S架构与初识socket 在开始socket介绍之前,得先知道一个Client端/服务端架构,也就是 C/S 架构,互联网中处处充满了 C/S 架构(Cl ...
随机推荐
- 在职场中混,"讲演稿"的重要性
背景: 在职场上工作的人,思维都像流水行云一样无拘无束.某时某刻说不定就会产生点“头脑风暴”. 但是在多数情总下,只是自己想想,跟朋友吹瞌子的时候随便说说,很少有用文字,图形把自己的思维给表现出来. ...
- Inter Core CPU 型号的尾字母含义
Inter Core CPU 型号的尾字母含义: M:表示移动处理器(Mobile Processor):QM:四核移动处理器(Quad Mobile Processor):U:超低电压处理器(Ult ...
- Fig 应用编排
Fig是Docker的应用编排工具,主要用来跟 Docker 一起来构建基于 Docker 的复杂应用,Fig 通过一个配置文件来管理多个Docker容器,非常适合组合使用多个容器进行开发的场景. 说 ...
- 过年7天乐,学nodejs 也快乐
自从上次接触nodejs 已经好长时间了,但是年底公司太忙了 ,没时间看, 上次文章在ubuntu上安装nodejs[开启实时web时代] http://www.cnblogs.com/qqlovin ...
- PHP设计模式笔记
一.工厂模式:减少new的使用,定义一个类,专门用来创建其它对象例: class A{ static function create(){ return new DB(); } } $db = A:: ...
- WCF学习之旅——第一个WCF示例(二)
第四步:通过自我寄宿的方式寄宿服务 WCF服务需要依存一个运行着的进程(宿主),服务寄宿就是为服务指定一个宿主的过程.WCF是一个基于消息的通信框架,采用基于终结点(Endpoint)的通信手段. 终 ...
- 利用免费cdn加速webpack单页应用
回顾现状 在之前的学习过程中,react单页应用经过webpack打包之后会输出大概如下的目录结构,它就是站点的所有前端组成了: 1 2 3 4 5 6 MacBook-Pro:output ba ...
- 《Qt Quick 4小时入门》学习笔记2
http://edu.csdn.net/course/detail/1042/14805?auto_start=1 Qt Quick 4小时入门 第五章:Qt Quick基本界面元素介绍 1. ...
- Adobe Photoshop CC 打开时报错~配置错误:请卸载并重新安装该产品
后期会在博客首发更新:http://dnt.dkill.net 异常处理汇总-开发工具 http://www.cnblogs.com/dunitian/p/4522988.html 个人估计,要么安 ...
- 用扩展开发一个PHP类
原文:http://my.oschina.net/mickelfeng/blog/122519?p=1 假设我们要用PHP扩展实 现一个类Person,它有一个private的成员变量$_name和两 ...