C# 网络编程(TCP、UDP)
2017-05-22 20:30
459 查看
一 TCP协议
基于TCP协议的Socket通讯类似于B/S架构,面向连接,但不同的是服务器端可以向客户端主动推送消息。使用Tcp协议通讯需要具备以下几个条件:
(1).建立一个套接字(Socket)
(2).绑定服务器端IP地址及端口号(服务器端)
(3).利用Listen()方法开启监听(服务器端)
(4).利用Accept()方法尝试与客户端建立一个连接(服务器端)
(5).利用Connect()方法与服务器建立连接(客户端)
(6).利用Send()方法向建立连接的主机发送消息
(7).利用Receive()方法接受来自建立连接的主机的消息(可靠连接)
TCP通信过程如下图:
二 UDP协议
基于UDP协议是无连接模式通讯,占用资源少,响应速度快,延时低。至于可靠性,可通过应用层的控制来满足。(不可靠连接)(1).建立一个套接字(Socket)
(2).绑定服务器端IP地址及端口号–服务器端
(3).通过SendTo()方法向指定主机发送消息(需提供主机IP地址及端口)
(4).通过ReciveFrom()方法接收指定主机发送的消息(需提供主机IP地址及端口)
UDP通信过程如下图:
三 TCP和UDP协议的区别
TCP协议和UDP协议连接过程的区别如下:1.基于连接与无连接;
2.对系统资源的要求(TCP较多,UDP少);
3.UDP程序结构较简单;
4.TCP数据传输采用流模式与UDP则采用数据报模式 ;
5.TCP保证数据正确性,UDP可能丢包,TCP保证数据顺序,UDP不保证。
四 TCP简单示例
该示例仅只进行了一次通信,如果要进行多次通信可以采用开启线程来实现。具体请参考我的另一篇博客里面的,链接:Unity聊天室实现服务器端:
using System; using System.Net; using System.Net.Sockets; using System.Text; namespace _009_socket编程_TCP { class Program { static void Main(string[] args) { //1.创建Socket Socket tcpServer = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //2.绑定IP跟端口号 IPAddress ipAddress = new IPAddress(new byte[]{127,0,0,1}); EndPoint endPoint = new IPEndPoint(ipAddress,7788);//ipEndPoint是对IP + 端口的封装 tcpServer.Bind(endPoint); //3.开始监听,等待客户端连接 tcpServer.Listen(100);//参数是最大的连接数 Console.WriteLine("开始监听..."); //4.使用返回的Socket与客户端通信 //暂停当前线程,直到有一个客户端连接过来,之后执行下面的代码 Socket clientSocket = tcpServer.Accept(); Console.WriteLine("客户端请求连接..."); string message = "Hello 欢迎您!"; byte[] data = Encoding.UTF8.GetBytes(message); clientSocket.Send(data); Console.WriteLine("向客户端发送消息..."); byte[] data2 = new byte[1024]; //创建一个字节数组来当作容器,去接收客户端发送过来的数据 int length = clientSocket.Receive(data2); string message2 = Encoding.UTF8.GetString(data2, 0, length); Console.WriteLine("接收从客户端发来的消息..." + message2); Console.ReadKey(); } } }
客户端:
using System; using System.Net; using System.Net.Sockets; using System.Text; namespace _001_Socket_TCP_客户端 { class Program { static void Main(string[] args) { //创建一个socket Socket tcpClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //发起建立连接的请求 IPAddress ipAddress = IPAddress.Parse("127.0.0.1"); EndPoint endPoint = new IPEndPoint(ipAddress,7788); tcpClient.Connect(endPoint); //通过ip:port端口号来定位一个要连接到的服务器端 byte[] data = new byte[1024]; int length = tcpClient.Receive(data); //这里传递一个byte数组,实际上这个data数组用来接收数据 //length返回值表示接收了多少字节的数据 string message = Encoding.UTF8.GetString(data, 0, length); //只把接收到的数据做一个转化 Console.WriteLine(message); //向服务器端发送消息 string message2 = Console.ReadLine();//读取用户输入,把输入发送到服务器端 tcpClient.Send(Encoding.UTF8.GetBytes(message2)); Console.ReadKey(); } } }
五 UDP简单示例
服务器端:using System; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading; namespace _011_socket编程_UDP { class Program { private static Socket updSocket; static void Main(string[] args) { //TCP以数据流的形式传输数据(SocketType.Stream),UDP以数据报的形式传送数据(SocketType.Dgram) //1.创建Socket updSocket = new Socket(AddressFamily.InterNetwork,SocketType.Dgram, ProtocolType.Udp); //2.绑定IP与端口号 updSocket.Bind(new IPEndPoint(IPAddress.Parse("127.0.0.1"),7788)); //3.接收数据 Thread t = new Thread(ReceiveMessage); t.Start(); //updSocket.Close(); Console.ReadKey(); } static void ReceiveMessage() { while (true) { EndPoint remoteEndPoint = new IPEndPoint(IPAddress.Any, 0); //不需要指定 byte[] data = new byte[1024]; //下列代码会等待接收数据,直到接收了一条数据之后才会向下依次执行 //该方法能够把数据的来源(ip:port)放到第二个参数上 int length = updSocket.ReceiveFrom(data, ref remoteEndPoint); string message = Encoding.UTF8.GetString(data, 0, length); Console.WriteLine("从IP:" + (remoteEndPoint as IPEndPoint).Address.ToString() + ":" + (remoteEndPoint as IPEndPoint).Port + "收到了数据:" + message); } } } }
客户端:
using System; using System.Net; using System.Net.Sockets; using System.Text; namespace _002_Socket_UDP_客户端 { class Program { static void Main(string[] args) { //创建Socket Socket udpSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); //循环发送数据 while (true) { EndPoint serverPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 7788); string message = Console.ReadLine(); byte[] data = Encoding.UTF8.GetBytes(message); udpSocket.SendTo(data, serverPoint); } udpSocket.Close(); Console.ReadKey(); } } }
相关文章推荐
- [转贴]基于UDP、TCP协议的C#网络编程之一
- [转贴]基于UDP、TCP协议的C#网络编程之二
- TCP和UDP通信(C#网络编程) ---- 系列文章
- 【转载】 基于UDP、TCP协议的C#网络编程
- C#网络编程-TcpClient、TcpListener、UdpClient
- 【转载】 基于UDP、TCP协议的C#网络编程
- 基于UDP、TCP协议的C#网络编程
- 基于UDP、TCP协议的C#网络编程之一
- 基于UDP、TCP协议的C#网络编程之一
- C#网络编程-TcpClient、TcpListener、UdpClient
- 基于UDP、TCP协议的C#网络编程之二
- 【转载】 基于UDP、TCP协议的C#网络编程
- 在C#中使用异步Socket编程实现TCP网络服务的C/S的通讯构架(一)----基础类库部分
- 在C#中使用异步Socket编程实现TCP网络服务的C/S的通讯构架(一)----基础类库部分
- C#网络编程(一)——C#开发TCP/IP聊天室
- 网络编程之TCP/UDP及其流程比较
- 在C#中使用异步Socket编程实现TCP网络服务的C/S的通讯构架(一)----基础类库部分
- C#中使用异步Socket编程实现TCP网络服务的CS的通讯构架(一)----基础类库部分
- C#中使用异步Socket编程实现TCP网络服务的C/S的通讯构架(二)
- C#网络编程之 UDP编程