上篇带大家看了Socket 实现TCP协议的数据通信,这篇再让大家了解一下Socket如何实现UDP协议通信的,并从中体会TCP、UDP的区别。
回顾Socket:
网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。
建立网络通信连接至少要一对端口号(socket)。socket本质是编程接口(API),对TCP/IP的封装,TCP/IP也要提供可供程序员做网络开发所用的接口,这就是Socket编程接口;HTTP是轿车,提供了封装或者显示数据的具体形式;Socket是发动机,提供了网络通信的能力。 Socket的英文原义是“孔”或“插座”。作为BSD UNIX的进程通信的机制,取后一种意思。通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,可以用来实现不同虚拟机或不同计算机之间的通信。在Internet上的主机一般运行了多个服务软件,同时提供几种服务。每种服务都打开一个Socket,并绑定到一个端口上,不同的端口对应于不同的服务。Socket正如其英文原意那样,像一个多孔插座。一台主机犹如布满各种插座的房间,每个插座有一个编号,有的插座提供220伏交流电, 有的提供110伏交流电,有的则提供有线电视节目。 客户软件将插头插到不同编号的插座,就可以得到不同的服务。——来自百度百科,感觉比喻的很形象,就借鉴过来了。demo实现:(代码很简单,但因为刚接触,实现的过程些许曲折,但还是实现了,happy~~)
服务端:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;
namespace SocketUDPService
{
class Program
{
#region Socket UDP 服务端——赵寒
static void Main(string[] args)
{
try
{
System.Console.WriteLine(DateTime.Now + "\nUDP服务端端-C#实现效果");
string host = "127.0.0.1";
int port = 2222;
IPAddress ip = IPAddress.Parse(host);
IPEndPoint ipe = new IPEndPoint(ip, port);//把ip和端口转化为IPEndPoint实例
Socket c = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);//创建一个Socket
c.Bind(ipe);
Console.WriteLine("WaiteConneting");
byte[] data = new byte[22];
EndPoint IPEndPoint = new IPEndPoint(IPAddress.Any, 0);
int recv = c.ReceiveFrom(data, SocketFlags.None, ref IPEndPoint);
string clientMessage = System.Text.Encoding.ASCII.GetString(data);
Console.WriteLine(clientMessage);
c.Close();
}
catch (ArgumentNullException e)
{
Console.WriteLine("ArgumentNullException: {0}", e);
}
catch (SocketException e)
{
Console.WriteLine("SocketException: {0}", e);
}
Main(args);
Console.ReadLine();
}
#endregion
}
}
客户端:
using System;效果图:
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;
namespace SocketUDPClient
{
class Program
{
public static int i;
#region Socket UDP 客户端——赵寒
static void Main(string[] args)
{
System.Console.WriteLine(DateTime.Now + "\nUDP客户端-C#实现效果");
try
{
IPEndPoint ipe = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 2222);
Socket c = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);//创建一个Socket
Console.WriteLine("Conneting");
c.Connect(ipe);//连接到服务器
string sendStr = "Client:I Send Message" + i;
byte[] bs = System.Text.Encoding.UTF8.GetBytes(sendStr);
Console.WriteLine("Send Message" + i);
c.SendTo(bs, bs.Length, SocketFlags.None, ipe);//发送测试信息
c.Close();
}
catch (ArgumentNullException e)
{
Console.WriteLine("ArgumentNullException: {0}", e);
}
catch (SocketException e)
{
Console.WriteLine("SocketException: {0}", e);
}
Console.WriteLine("输入 y 继续发送");
string str = Console.ReadLine();
if (str == "y")
{
i++;
Main(args);
}
}
#endregion
}
}
服务端开启: 客户端连接并发送数据:
客户端持续发送,服务端持续接收:
然后断开服务,客户端继续发送(注意!!!):
再打开服务,客户端继续发送:
总结:
还记不记得,用TCP协议时,服务端断开,则客户端报错??????但UDP协议并没有。这也是他们的差异之一。
我的理解:TCP协议就相当于打电话,只有打通了,对方接了才算打电话成功。
但UDP更像发短信,我只要发出去了,就算成功,不管你看没看到。
UDP的用途很广泛,比如网上看球赛直播,用户更注重实时性,所以可以采用UDP协议,过程中丢一两帧,也无所谓,只要能跟上直播的速度就行。而且UDP相对TCP的一个优点就是:速度快(不用得到响应)。当然缺点就是:安全性低(过程中丢了数据你也不知道)......