我们做网络通信的时候需要有通信协议,在进行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协议的通信已经完成。
|