socket通信是C#中非常基础的一个知识点,我这里用到的是基于Tcp协议的socket通信。Tcp会有三次握手连接通信.
一、 创建服务端socket的步骤:
1.首先需要引用socket通信中所用到的名称空间;
using System.Net; using System.Threading; using System.Net.Sockets;
这三个名称空间是为socket通信打基础,没有这三个名称空间无法实现socket通信.
2.接下来就是要创建一个socket的对象了,创建socket对象是为了方便客户端与服务端之间的通信,如果你还不明白,就请往下继续看;
Socket serverSocket = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
在这里面有几个知识点我要补充一下:
socket类中的参数我做简要阐述,AddressFamily.InterNetwork简单来说就是使用内网,啥,你不知道内网是什么东东?至于内网是啥,内网就是不能上互联网的局域网;SocketType.Stream是流式的套接字类型,这种套接字类型是一种可靠且双向,基于连接的字节流,不重复数据,简单一点就是支持双向通信;ProtocolType.Tcp指的是使用基于tcp协议的通信协议。
3.绑定IP地址和端口号;
//将字符串类型的IP地址转换为IPAddress类型 IPAddress ip = IPAddress.Parse("173.168.5.15"); //标识网络地址 EndPoint point = new IPEndPoint(ip,port); serverSocket.Bind(point);
如果你想实现socket通信就必须绑定IP地址和端口号,IP地址是计算机的通信地址,端口号指向计算机中某个软件或者说是应用程序;
4.监听客户端的连接;
serverSocket.Listen(10);
参数指的是监听客户端的最大数量。
5.为连接到的客户端新建一个socket;
Socket ListenClientSocket= serverSocket.Accept();
这是规定,如果不新建一个socket无法通信。
这一步完成时客户端给服务端发送消息且客户端会连接到服务端,完成第一次握手。
6.向客户端发送消息;
ListenClientSocket.Send(data);
此时服务端给客户端发送消息完成第二次握手。
7.接受客户端消息;
byte[] data2 = new byte[1024]; int length=ListenClientSocket.Receive(data2); string message2=Encoding.UTF8.GetString(data2,0,length); Console.WriteLine("接收到客户端传来的消息:"+message2);
服务端接收到客户端的消息完成第三次握手。
服务端socket 完整代码如下:
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 using System.Net; 7 using System.Threading; 8 using System.Net.Sockets; 9 10 namespace serverSocketTest2 11 { 12 class Program 13 { 14 static int port = 3500; 15 static void Main(string[] args) 16 { 17 //创建一个socket的对象 18 Socket serverSocket = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp); 19 //将字符串类型的IP地址转换为IPAddress类型 20 IPAddress ip = IPAddress.Parse("173.168.5.15"); 21 //标识网络地址 22 EndPoint point = new IPEndPoint(ip,port); 23 serverSocket.Bind(point); 24 //开始监听 25 serverSocket.Listen(10); 26 Console.WriteLine("等待客户端连接..."); 27 28 //为连接客户端需要新建一个线程 29 Socket ListenClientSocket= serverSocket.Accept();//暂停当前线程,等待客户端连接之后再执行之后的语句 30 Console.WriteLine("客户端连接成功! 真是令人振奋!"); 31 //传送的消息 32 string message = "Hello Client!"; 33 //将字符串类型的数据转换为byte类型的数组 34 byte[] data=Encoding.UTF8.GetBytes(message); 35 //发送消息 36 ListenClientSocket.Send(data); 37 38 /////接受客户端数据 39 byte[] data2 = new byte[1024]; 40 41 int length=ListenClientSocket.Receive(data2); 42 string message2=Encoding.UTF8.GetString(data2,0,length); 43 Console.WriteLine("接收到客户端传来的消息:"+message2); 44 45 Console.ReadKey(); 46 } 47 } 48 }
二、 创建客户端socket的步骤如下:
1.引用进行socket通信的名称空间;
using System.Net; using System.Threading; using System.Net.Sockets;
原因我不再赘述了,相信聪明的你们都懂.
2.客户端向服务端发送连接的请求,建立客户端和服务端的连接;
clientSocket.Connect(ip,port);
这是第一次握手。本次握手与服务端里的第一次握手同步执行,其实这次握手也是服务端里的第一次握手。
3.接收数据;
clientSocket.Receive(data);
在这里需要将客户端接收到的数据返回一个长度并存储到byte数组里。
4.将字节型数据转换成字符串型的数据;
string message=Encoding.UTF8.GetString(data,0,length);
5.发送数据
clientSocket.Send(data2);
第二次握手连接。本次握手与服务端里的第二次握手同步执行,其实这次握手也是服务端里的第二次握手。
客户端socket 完整代码如下:
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 using System.Net; 7 using System.Threading; 8 using System.Net.Sockets; 9 10 namespace clientSocketTest2 11 { 12 class Program 13 { 14 static int port = 3500; 15 static void Main(string[] args) 16 { 17 //新建一个socket 18 Socket clientSocket = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp); 19 IPAddress ip = IPAddress.Parse("173.168.5.15"); 20 21 //客户端向服务端发送连接的请求,建立客户端和服务端的连接 22 clientSocket.Connect(ip,port); 23 //存储数据,接收数据 24 byte[] data=new byte[1024]; 25 int length=clientSocket.Receive(data); 26 //转换为字符串型的数据 27 string message=Encoding.UTF8.GetString(data,0,length);//0,length 表示的是发送的数据的长度 28 Console.WriteLine("接收到来自服务端的数据:"+message); 29 30 /////// 发送数据 31 string message2 = Console.ReadLine(); 32 byte[] data2=Encoding.UTF8.GetBytes(message2); 33 clientSocket.Send(data2); 34 35 Console.ReadKey(); 36 37 } 38 } 39 }
这是我的理解,如果有不足的地方,请指教,共同学习!希望共同进步!