网络七层协议
Socket在哪一层?
结论:可以看到socket在运输层,网络层,在其之上,是基于socket的一样应用层等;在其之下,则是硬件层.一般来说,网络开发程序员没必要注意这些.
TCP和UDP区别和为什么先学TCP编程
TCP是面向连接的,和UDP相比速度没有那么快.因为TCP会自己维护网络连接.打个比方相当于手机间通信,会建立连接.发生网络异常如丢包等故障会自动重发,无须程序员手动处理太多异常情况.TCP网络包会严格遵守发送顺序来接收.
UDP不是面向连接的.和TCP相比速度快,发了不管,接收方可能收到,也可能没有收到.并且接收网络包时也不能保证按发送先后顺序接收.打个比方相当于对讲机通信.发送方的语音接收方可能听到可能听不到.程序员面对网络丢包,发送顺序等异常情况必须手动编程自己完成对网络异常的处理.
二者应用场景:UDP适用于对即时网速要求很高且可以容忍一定丢包的场景,比如fps游戏,语音,视频通话等;TCP适用于对网速要求没那么高的网游,休闲游戏等,其他应用等.有好多网络应用层上的协议是基于TCP协议的,比如常见的http协议等.
因此我们先学习TCP编程,因为这样比较简单,不用手工去管理消息先后顺序,也不用手工去管一些简单的网络不畅时重发消息.
Socket中TCP工作原理图
无论使用什么编程语言,什么操作系统平台,使用tcp编程开发的工作流程基本如下图示意:
注:上图服务器端工作流程以简单的同步阻塞方式举例.在实际编程中我们当然要采用socket的异步非阻塞编程方式.
服务器使用1个socket在指定端口监听并联入客户端.
每当1个客户端联入服务器,服务器会产生1个socket专用于和该客户端通讯(通讯结束请关闭该socket)
对客户端来说,只需建立1个socket用于和服务器通讯即可(通讯结束请关闭socket)
下图示意服务器和客户端建立连接后的通讯:(注意!服务器用于监听的socket并未列入图中)
为什么选择C#开发socket?
常用的网络开发语言是c和C++等.Linux和Windows都有socket可以使用.大体上一致但是细节上有差异.所以没有办法写一套代码同时开发两个平台的程序,必须开发两套.
微软为了在未来竞争中不至于落后,开发了.net core(最新版本称为.net 5, 6, 7)实现跨平台,即一套代码可同时应用于windows和linux两个平台.(但不能实现视窗桌面程序跨平台)
注意:.net framework是较老的.net版本(已淘汰),它不可跨平台;.net core是可以跨平台的(linux&windows).但现在已经淘汰不再支持.最新的版本中微软把.net framework和.net core合二为一,总称为.NET(即.net5. .net6, .net7可跨平台),如果你晕了就记住一点,现在开发.net程序(无论是否跨平台)请使用.net6长期支持版本,而尽量不要使用看起来更新的.net7(非长期支持版本)
所以我们使用C#+.NET6(跨平台)来开发网络程序,这样一套程序可同时运行于windows和linux平台,无须耗费精力人力开发两套代码
C# socket编程三种方式
[不推荐]socket同步编程-仅为学习,实际编程不用
注意:Socket类的不带修饰词的例如Accept, Send, Receive方法都是同步方法.实际编程不会使用.
[不推荐]socket较早异步编程:XXXBegin/XXXEnd方法
微软较早出的socket异步编程.每个begin方法均需要1个回调函数.在高性能大并发条件下开销比较大(如果进行大量异步套接字操作,是要付出代价的。针对每次操作,都必须创建一个IAsyncResult对象,而且该对象不能被重复使用。由于大量使用对象分配和垃圾收集,这会影响性能。).建议使用下一种推荐的socket异步编程.(为了解决这个问题,新版本提供了另一个使用套接字上执行异步I/O的方法模式。这种新模式并不要求为每个套接字操作分配操作上下文对象。)
[推荐]socket推荐异步编程:XXXAsync方法
微软专为高性能高并发设计的socket异步编程方式.推荐实际使用.适合紧迫,高速的高并发环境.
C# socket同步编程简单示例
见以下两个讲座中教授的初始示例.
C# socket异步编程简单示例-XXXBegin/XXXEnd方法
给出实例吧.https://www.bilibili.com/video/BV1M44y1K7pY siki学院unity网络游戏讲座
官方链接:
C# socket异步编程简单示例-XXXAsync方法
实例见:https://www.bilibili.com/video/BV1M44y1K7pY 泰课在线斗地主实例
官方链接: