浅谈C#Socket

好不容易把socket通信搞懂一点,比较喜欢做笔记,嘿嘿~

希望共同学习,共同进步!

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 }

     这是我的理解,如果有不足的地方,请指教,共同学习!希望共同进步!

原文地址:https://www.cnblogs.com/jc-1997/p/6187413.html