C# Socket学习-构建Socket服务器

Posted 工控上位机学习

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C# Socket学习-构建Socket服务器相关的知识,希望对你有一定的参考价值。

工控课堂

工控课堂【www.gkket.com】工程师必备网站

电气工控自动化-超万元免费资料

前言

这里说的服务器是Web服务器,是类似IIS、Tomcat之类的,用来响应浏览器请求的服务。

Socket模拟浏览器的Url Get请求

首先浏览器的请求是HTTP协议。我们上一篇说过,HTTP是短连接,用完就断开,是无状态的。所以我们在等待响应的时候不需要另外开个线程循环等待。
也就是我们只需要通过Socket和服务器建立连接,然后发送请求,然后接收服务器的响应,这样就完成了一次请求。
可是,我们一般访问网页的时候都是通过域名,没有IP也没有端口,怎么和服务器建立连接了。这里就需要用到我们上篇介绍的几个类了:

//根据DNS获取域名绑定的IPforeach (var address in Dns.GetHostEntry("www.baidu.com").AddressList){ Console.WriteLine($"百度IP:{address}");}
//字符串转IP地址IPAddress ipAddress = IPAddress.Parse("192.168.1.101");
//通过IP和端口构造IPEndPoint对象,用于远程连接//通过IP可以确定一台电脑,通过端口可以确定电脑上的一个程序IPEndPoint ipEndPoint = new IPEndPoint(ipAddress, 80);
void ...(){ //得到主机信息 IPHostEntry ipInfo = Dns.GetHostEntry(new Uri("http://fanyi-pro.baidu.com").Host); //取得IPAddress[] IPAddress[] ipAddr = ipInfo.AddressList; //得到服务器ip IPAddress ip = ipAddr[0]; //组合远程终结点 IPEndPoint ipEndPoint = new IPEndPoint(ip, 80); //创建Socket 实例 Socket socketClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);  //尝试连接 socketClient.Connect(ipEndPoint); //发送请求 Send(socketClient); //接收服务器的响应  Receive(socketClient); }
//接收来自服务端的消息void Receive(Socket socketClient){ byte[] data = new byte[1024 * 1024]; while (true) { //读取客户端发送过来的数据 int readLeng = socketClient.Receive(data, 0, data.Length, SocketFlags.None); textBox2.AppendText($"{socketClient.RemoteEndPoint}{Encoding.UTF8.GetString(data, 0, readLeng)} "); }}
//发送消息到服务端void Send(Socket socketClient){ //为了方便演示,仅用请求报文的前两行即可。(切记:需要严格按照报文格式。如,最后需要连续两次换行) var msg = $"GET / HTTP/1.1 Host: {new Uri(textBox1.Text).Host} "; socketClient.Send(Encoding.UTF8.GetBytes(msg));}

整个流程也就是:

  • 1、dns服务把域名解析成ip

  • 2、通过ip和端口和服务器建立连接(三次握手)

  • 3、获取html文档

  • 4、根据文档里面的链接(js、css、img)再重复以上过程

【注意】:发送报文的时候需要严格按照报文格式。如,最后需要连续两次换行、行末不能有空格等。

效果图:
C# Socket学习-构建Socket服务器

用Socket实现Web服务器

Web服务器的实现和我们上一篇的Socket聊天服务端其实也差不多。
不同之处就在于,解析请求报文,然后按HTTP协议回复标准的响应报文(我这里为了简单,就没有按标准的协议来玩,仅仅只是实现了表面的效果)
代码如下:

void ...(){ //1 创建Socket对象 Socket socketServer = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//2 绑定ip和端口 IPAddress ip = IPAddress.Parse("127.0.0.1"); IPEndPoint ipEndPoint = new IPEndPoint(ip, 80); socketServer.Bind(ipEndPoint);
//3、开启侦听(等待客户机发出的连接),并设置最大客户端连接数为10 socketServer.Listen(10); //阻塞等待客户端连接 Task.Run(() => { Accept(socketServer); });}
//4 阻塞等待客户端连接private static void Accept(Socket socketServer){ while (true) { //阻塞等待客户端连接 Socket newSocket = socketServer.Accept(); Task.Run(() => { Receive(newSocket); }); }}
//5 读取客户端发送过来的报文private static void Receive(Socket newSocket){ byte[] data = new byte[1024 * 1024]; while (newSocket.Connected) { //读取客户端发送过来的数据 int readLeng = newSocket.Receive(data, 0, data.Length, SocketFlags.None); //读取客户端发来的请求报文 var requst = Encoding.UTF8.GetString(data, 0, readLeng); //解析请求报文的请求路径(可以解析请求路径、请求文件、文件类型) var requstFile = requst.Split(" ")[0].Split(" ")[1]; //回复客户端响应报文 Send(newSocket, requstFile); }}
//6 回复客户端响应报文private static void Send(Socket newSocket, string requstFile){ //这里如果请求的根目录,默认显示Index.html if (requstFile == "/" ) requstFile = "/Index.html";
var msg = File.ReadAllText(Directory.GetCurrentDirectory() + requstFile); //把消息内容转成字节数组后发送 newSocket.Send(Encoding.UTF8.GetBytes(msg)); //回复响应后马上关闭连接 newSocket.Shutdown(SocketShutdown.Both); newSocket.Close();}

效果如下:
C# Socket学习-构建Socket服务器
C# Socket学习-构建Socket服务器
由此我们知道了.net core为什么可以在不需要iis的情况下,一个黑窗体就提供了对网址的访问。其实也就是KestrelServer通过Socket绑定并监听端口提供的服务。
【注意】:我们绑定的ip是127.0.0.1socketServer.Bind(ipEndPoint),所以我们测试的时候只能在浏览器输入127.0.0.1或者localhost。如果想通过内外ip访问,我们可以绑定任意ipIPAddress.Any。如socketServer.Bind(new IPEndPoint(IPAddress.Any, port))

为什么不见三次握手

对于HTTP/TCP可能大家多少都听过三次握手,可是在我们在用Socket编写Web服务器的时候并没有看到相关的东西啊,这是怎么回事。
因为我们在客户端执行连接socketClient.Connect(ipEndPoint)的时候已经进行了三次握手
C# Socket学习-构建Socket服务器
具体可细读小坦克大佬的文章。
也就是说我们在用C#的Socket、TCP、HttpClient的时候根本就不用关注这些细节。
另外套接字有三种不同的类型:流套接字、数据报套接字和原始套接字。前两者是标准套接字,分别对应TCP和UDP。而原始套接字则更加底层更加牛逼,普通开发人员一般接触不到。
我们说的HTTP、TCP、UDP之类都是网络协议,那协议到底是什么?通俗的说其实只是你我他之间的一个约定而已,大家都按规定了来那就可以说是协议。
而HTTP又是建立在TCP之上的,也就是说基础协议之后再加约定又可以成为一种新的协议。下章我们将用Socket来实现ModbusTCP协议对寄存器读和写。

转发是最大的鼓励!谢谢您的支持!

重要通知

想加入工控上位机学习技术交流群

请添加班长为好友

并备注:地区-行业-姓名昵称获取进群资格。

C# Socket学习-构建Socket服务器

工控上位机学习
专业专注分享

      

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

 来源:工控课堂www.gkket.com,侵删!

▣ 声明:本文素材系网络收集,工控上位机学习编辑整理。文中所用视频、图片、文字版权归原作者所有。但因转载众多,无法确认真正原始作者,故仅标明转载来源。如涉及作品版权问题,烦请及时联系17621634088(微信同号),我们将即刻确认版权并按国家相关规定支付稿酬!


C# Socket学习-构建Socket服务器

她们都关注了,你还等什么?

C# Socket学习-构建Socket服务器 C# Socket学习-构建Socket服务器 C# Socket学习-构建Socket服务器 C# Socket学习-构建Socket服务器 C# Socket学习-构建Socket服务器 C# Socket学习-构建Socket服务器 C# Socket学习-构建Socket服务器

 猛戳阅读原文,开启电气工控自动化之路

以上是关于C# Socket学习-构建Socket服务器的主要内容,如果未能解决你的问题,请参考以下文章

Node.Js + Socket.IO vs SignalR vs C# WebSocket 服务器

TCP/IP协议学习 基于C# Socket的Web服务器---动态通讯实现

Socket 服务器应用程序的选择:C/C++ 或 C#

C# socket 服务器控制 客户端 开机、关机、黑屏。

C# 1000个socket客户端并发

通过套接字从 c# 向节点 socket.io 服务器发送数据