分享

C#socket编程

 行走在理想边缘 2020-11-23

我们做网络通信的时候需要有通信协议,在进行socket编程的时候有两种通信协议TCP、UDP,这次我们就用简单的方式在一台电脑建立TCP协议的服务器端和客户端并使之进行通信。

服务器端和客户端进行连接,第一步就行在服务器端创建一个socket,开始监听客户端的连接,然后在客户端创建一个socket,向服务器端发起连接,这样连接建立起来之后就可以进行数据的交换。

由于Visual Studio一个解决方案下边只能启动一个项目,所以我们要创建两个解决方案(打开两个VS),一个解决方案下边创建服务器端,另一个解决方案下边创建客户端(均为控制台应用程序)。

我们先来看完整的代码,之后在分步骤进行解释

服务器端:

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;

namespace 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[] { 192,168,1,145 });
            EndPoint point = new IPEndPoint(ipaddress, 5566);
            tcpServer.Bind(point);//向操作系统申请一个可用的IP地址和端口号,用来做通信

            //3.开始监听 等待客户端连接
            tcpServer.Listen(100);//参数为最大连接数
            Console.WriteLine("开始监听");

            Socket clientSocket = tcpServer.Accept();//暂停当前线程,直到有一个客户端连接 //使用返回的Socket跟客户端做通信
            Console.WriteLine("一个客户端连接");

            //4.向客户端发送数据
            string message = "Hello";
            byte[] data = Encoding.UTF8.GetBytes(message);
            clientSocket.Send(data);//Send方法只能接受byte类型,于是先把数据转为byte类型。
            Console.WriteLine("向客户端发送一条数据");

            //5.接收客户端的数据
            byte[] data2 = new byte[1024];//创建字节数组接收客户端的数据 返回值length表示接收了多少字节的数据
            int length = clientSocket.Receive(data2);
            string message2 = Encoding.UTF8.GetString(data2, 0, length); //只把接收到的数据(0 - length)进行转化
            Console.WriteLine("接收到了一条消息:" + message2);

            Console.ReadKey();
        }
    }
}

客户端:

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;

namespace socket编程_TCP协议_客户端
{
    class Program
    {
        static void Main(string[] args)
        {
            //1.创建Socket
            Socket tcpClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

            //2.发起建立连接请求
            IPAddress ipaddress = IPAddress.Parse("192.168.1.145");
            EndPoint point = new IPEndPoint(ipaddress, 5566);
            tcpClient.Connect(point);//通过IP和端口号,定位一个要连接到的服务器端

            //3.接收数据
            byte[] data = new byte[1024];
            int length = tcpClient.Receive(data);//传递一个byte数组,实际上是用来接收数据 返回值length表示接收了多少字节的数据
            string message = Encoding.UTF8.GetString(data,0,length);//只把接收到的数据(0-length)进行转化
            Console.WriteLine(message);

            //4.向服务器端发送消息
            string message2 = Console.ReadLine();//读取用户输入
            tcpClient.Send(Encoding.UTF8.GetBytes(message2));//把字符串转为字节数组 发送到服务器端


            Console.ReadKey();
        }
    }
}

下边我们来分布进行解释

1.首先我们先来创建服务器端

(1)创建Socket(Socket属于命名空间System.Net.Sockets下的一个类),参数选择InterNetwork(内网)、Stream(流),以及我们的Tcp协议。

//1.创建socket
Socket tcpServer = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

(2)绑定IP跟端口号

每个计算机都有一个网络的地址(也可能有多个网卡,就会有不同的IP地址,我们要选择指定的IP地址进行通信),局域网的地址一般为192.168.x.x,即为IP地址,但是仅仅获取IP地址就可以了吗?显然是不行的,每个计算机都有很多软件,需要通信的软件有很多个,如果只通过IP地址发送数据,计算机并不能判断数据要发送给哪个软件,所以这个时候就需要通过端口号区分数据所要分配的软件,每个软件申请的端口号是唯一的,端口号一般为0-60000。所以通过IP地址找到计算机,通过端口号找到软件,我们才可以进行通信。

如何查看本机的IP地址?

在控制台中输入ipconfig,回车。

这里可以看到我的IP地址为192.168.1.145。端口号可以随便取,这里我们就采用5566。

接着我们继续写代码

//2.绑定IP跟端口号
IPAddress ipaddress = new IPAddress(new byte[] { 192,168,1,145 });
EndPoint point = new IPEndPoint(ipaddress, 5566);
tcpServer.Bind(point);//向操作系统申请一个可用的IP地址和端口号,用来做通信

(3)开始监听 等待客户端连接

//3.开始监听 等待客户端连接
tcpServer.Listen(100);//参数为最大连接数
Console.WriteLine("开始监听");
Socket clientSocket = tcpServer.Accept();//暂停当前线程,直到有一个客户端连接 //使用返回的Socket跟客户端做通信
Console.WriteLine("一个客户端连接");

(4)向客户端发送消息

//4.向客户端发送数据
string message = "Hello";
byte[] data = Encoding.UTF8.GetBytes(message);//Send方法只能接受byte类型,于是先把数据转为byte类型。
clientSocket.Send(data);
Console.WriteLine("向客户端发送一条数据");

(5)接收消息、

//5.接收客户端的数据
byte[] data2 = new byte[1024];//创建字节数组接收客户端的数据 返回值length表示接收了多少字节的数据
int length = clientSocket.Receive(data2);
string message2 = Encoding.UTF8.GetString(data2, 0, length); //只把接收到的数据(0 - length)进行转化
Console.WriteLine("接收到了一条消息:" + message2);

2.创建客户端

(1)创建Socket

//1.创建Socket
Socket tcpClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

(2)发起建立连接请求

//2.发起建立连接请求 IP地址和端口号要和服务器端保持一致
IPAddress ipaddress = IPAddress.Parse("192.168.1.145");//此方法也可以绑定IP地址
EndPoint point = new IPEndPoint(ipaddress, 5566);
tcpClient.Connect(point);//通过IP和端口号,定位一个要连接到的服务器端

(3)接收数据

//3.接收数据
byte[] data = new byte[1024];
int length = tcpClient.Receive(data);//传递一个byte数组,实际上是用来接收数据 返回值length表示接收了多少字节的数据
string message = Encoding.UTF8.GetString(data,0,length);//只把接收到的数据(0-length)进行转化
Console.WriteLine(message);

(4)向服务器端发送消息

//4.向服务器端发送消息
string message2 = Console.ReadLine();//读取用户输入
tcpClient.Send(Encoding.UTF8.GetBytes(message2));//把字符串转为字节数组 发送到服务器端

——————————————————————————————————————————————————

此时我们已经可以进行测试,首先启动服务器端

然后启动客户端,此时服务器端已经发生变化

向服务器端发送消息

此时一个简单的tcp协议的通信已经完成。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多