我学习Socket的动机很简单,我要做一个基于Socekt的网络游戏。
关于Socket的基础概念以及相关知识,请大家自行百度。
- https://blog.csdn.net/fighting_xa/article/details/50623571
- http://liuliliujian.iteye.com/blog/898342
- https://baike.baidu.com/item/socket/281150?fr=aladdin
- 看不懂没关系,因为我也看不懂。(旁白:滚!)
既然谈到Socket,就得牵扯到服务器端,什么是服务器端呢?
个人理解:服务器端就是自己的代码,让它跑在云主机(云服务器上,比如阿里云,亚马逊云这些)。而这些,其实就是在云端买了一个主机,它和你正在使用的电脑一样,有桌面,有系统,有蜘蛛纸牌。。。
不同的是,它有固定的公网IP,而我们电脑公网IP是变化的(所以如果要把自己电脑变成服务器的话需要用花生壳做内网穿透)。
所以我们要把代码里绑定IP和连接IP的地方改成服务器的公网IP就行了。然后只需要把你服务器代码生成的exe文件在上面打开。让它365天没日没夜开着机就行了。
那么Socket到底是个啥?
先看一张图
Socket是一个接口,是应用层与TCP/IP协议族通信的中间软件抽象层,在用户进程与TCP/IP协议之间充当中间人,完成TCP/IP协议的书写,用户只需理解接口即可。
在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。它的出现只是使得程序员更方便地使用TCP/IP协议栈而已。Socket本身并不是协议,它是应用层与TCP/IP协议族通信的中间软件抽象层,是一组调用接口(TCP/IP网络的API函数)。
TCP/IP协议又是个啥?
从上图可以看出可以看出TCP/IP协议族包括运输层、网络层、链路层。TCP/IP只是一个协议栈,就像操作系统的运行机制一样,必须要具体实现,同时还要提供对外的操作接口。就像操作系统会提供标准的编程接口,比如Win32编程接口一样,TCP/IP也必须对外提供编程接口,这就是Socket编程接口
Socket跟TCP/IP并没有必然的联系。Socket编程接口在设计的时候,就希望也能适应其他的网络协议。所以,Socket的出现只是可以更方便的使用TCP/IP协议栈而已,其对TCP/IP进行了抽象,形成了几个最基本的函数接口。比如create,listen,accept,connect,read和write等等。
socket只是对TCP/IP协议栈操作的抽象,而不是简单的映射关系,这很重要!
通俗点讲:
可以这样理解,你可以简单的理解为电话号码。你这边一个电话号码 发送信息,另一个电话号码接收你发送的消息。而中间传输这些信息的过程和技术就是TCP/IP,我们不需要了解,我们只需要知道要拨打的号码(Socket ip地址和端口)即可。你用的这个号码指定发给哪个号码,就只有哪个号码可以接收你发送的消息。这两个电话可收信息,可发信息。就是担任着Socket的角色。两个手机就是你用的电脑了。Socket也一样,指定了ip和端口就变成独一无二的电话号码了。
参考:https://www.cnblogs.com/battler/archive/2007/01/22/626846.html
https://blog.csdn.net/github_34606293/article/details/78230456
https://zhidao.baidu.com/question/531812409.html
https://blog.csdn.net/weixin_39258979/article/details/80835555