- 博客(13)
- 资源 (3)
- 收藏
- 关注
原创 UDP协议解惑
由于平时UDP协议接触的少,最近在梳理网络编程知识的时候,发现好多之前没有深入了解过的问题,有的甚至颠覆了以前的网络编程知识。以下是几个很重要的知识点。1 UDP的无连接学过网络编程的朋友都知道,TCP是有连接的,而UDP协议是无连接的。那么这个连接究竟指的什么?从编程的角度来说,连接指的是套接字描述符绑定了通信两端EndPoint的接口。例如TCP建立的连接一定是两个真实有效的两端,...
2018-04-27 22:37:51 559
原创 http服务器究竟做了什么(四)
这篇开始讲服务器的代码.为了让初学者更好的理解http服务器的基本原理,抓住主干,排除其他干扰,我这里用了最轻量级的http服务器tinyhttp,总共代码只有500行左右.麻雀虽小,五脏俱全. tinyhttp实现了http服务器的基本功能.首先,初学者要懂基本的socket编程,知道socket编程的基本流程.因为http服务器也是基于socket编程的.为了更直白的演示http服务器的流程,...
2018-04-24 22:25:53 637
原创 http服务器究竟做了什么(三)
本节内容将通过一些示例来说明CGI程序.前面讲过CGI程序可以用任何语言编写,考虑到便捷性,这里用python来展示CGI程序.首先搭建服务器.我这里用了最轻量级的http服务器tinyhttp,总共代码只有500行左右,后面的服务器代码分析也是基于这个.在他的htdocs里添加一个test.cgi,写CGI代码.注意,test.cgi脚本要有可执行的的权限,否则访问test.cgi时,将直接读取...
2018-04-23 11:55:55 563
原创 匿名管道为什么可以在父子进程间通信
网上关于匿名管道的用法已经非常多了,这里就不再过多的介绍,只关注本篇的主题.匿名管道创建函数pipe()系统调用底层的实现就相当于一个特殊的文件系统,每次调用的时候创建一个inode关联着两个file,一个用于读,一个用于写,从而实现数据的单向流动.一个管道实际上就是一个无形(只存在于内存中)的文件,对这个文件的操作要通过两个已经打开的文件进行,分别代表该管道的两端 .每个文件都是有一个inode...
2018-04-20 19:52:14 2499
原创 http服务器究竟做了什么(二)
上篇http服务器究竟做了什么(一)提到http服务器会有接口让第三方程序来接入,从而实现业务分离的作用.接口肯定有接口的规范,例如我国家用插座输出电压规范是220v,厂商都是根据这个规范来生产家电的.那么http服务器接口的规范是什么呢?他有有个专有名词:Common Gateway Interface(通用网关接口),简称CGI.服务器与CGI主要通过标准输入输出来通信和交互.CGI本质上是一...
2018-04-20 11:34:29 708
原创 skynet watchdog和gate
skynet lua层的基础讲解的差不多了.就剩下网络这一块了.网络这块比前面的复杂,也是skynet框架的精华所在,所以放在后面慢慢讲解.今天看了服务器与客户端交互常见的watchdog和gate模块,相当于封装了socket api的调用,程序只需要写发送和接收的逻辑即可,很是方便.下面是我花了一下午的时间,制作的UML时序图,可能不是很规范,但还算比较清晰.看到上面图,是不是感觉...
2018-04-19 21:05:21 2812 1
原创 http服务器究竟做了什么(一)
本篇文章旨在从服务器后台开发的角度剖析一个简单的http服务器的运行原理.我们知道浏览器是http(s)的客户端,目的是连接远程的http服务器,然后服务器返回浏览器数据.浏览器接收数据解析数据之后展现出来.我们看到的外在表现就是,浏览器访问一个url,然后就得到相应的web页面.同样我们知道,浏览器与http服务器是通过http协议,传输层是tcp协议,因为他是有连接,可靠的协议.关于http协...
2018-04-18 21:09:55 4285
原创 lua的元表
接触lua一年多,是要把lua的高级特性总结一下了.先说说元表吧.元表是什么?为什么要有元表?学过C++的童鞋应该知道操作符重载.例如,自定义一个复数类,可以让他的两个实例相加减等等.同理,lua的元表也可以让两个表相加减,但是他使用了更简单的语法.lua的元表是为了扩展lua的特性,使他的功能更加丰富.要想使一个表拥有加法操作的功能,必须给他添加一种元表__add,语法如下:...
2018-04-17 21:23:38 571
原创 skynet lua层消息的执行顺序
前几篇讲解了服务之间互相发送消息,消息的挂起,恢复,fork等等,感觉还是有点搞不清他们之间是怎么协作的,例如fork产生的协程什么时候被调用,如果有多个fork又怎么被调用.这篇试着讲解一下.首先要明白的是,一般所有的lua层函数都是以协程的方式被执行的,包括fork产生的函数.除非你在skynet.start()之外调用函数.这点通过前面的分析可以知道. start()函数调用timeout产...
2018-04-15 17:12:30 1745
原创 以太网数据帧结构以及大小限制
以太网数据帧结构 以太网是目前最流行的一种局域网组网技术(其他常见局域网组网技术还有令牌环局域网、无线局域网、ATM局域网),以太网技术的正式标准是IEEE 802.3标准,它规定了在以太网中传输的数据帧结构,如下图所示。 1、前导码/帧起始定界符:7字节0x55,一串1、0间隔,用于信号同步,1字节0xD5(10101011),表示一帧...
2018-04-09 21:47:58 9805
原创 skynet 定时器sleep与fork
在前面的几篇中定时器其实我们已经应用过了,入口函数就是靠定时器驱动的,只不过他的定时为0.参见skynet lua业务逻辑的启动--skynet.start().在后面的服务与服务交互中,为了保证在A服务call B服时,B服务已经启动,我们特意在A服务call前执行了一个无意义的循环.这节中的定时器就可以解决这个问题,调用skynet.sleep(xxx)就可以让协程挂起.我们看看slee...
2018-04-03 20:15:56 4048 1
原创 skynet call的实现--服务与服务的交互
在实现业务逻辑的过程中,各个逻辑一般会抽象成一个服务,例如游戏中的登录服务,访问数据库服务,创建房间服务等等.服务与服务之间肯定是要通信和交互的,例如登录的时候要请求数据库验证.skynet是怎么实现两个服务的通信和交互的呢?为了突出主干,我简化了lua服务代码,A服务调用B服务:A服务代码(bootstrap.lua):skynet.start(function() local ad...
2018-04-02 17:07:22 3643
原创 skynet lua业务逻辑的启动--skynet.start()
上两篇skynet主体流程, skynet怎么启动lua文件介绍了skynet代码的主体流程,还有怎么启动lua逻辑.我们知道skynet业务逻辑都是在lua里写的,这样大大提高了开发效率,而且使热更新成为可能,究竟lua层是怎么保证逻辑正常运行,一个服务在lua层的表现形式又是怎么样的呢?这篇将为您讲解.一个服务在lua层的入口是skynet.start(),他的实现为:funct...
2018-04-02 11:09:50 3824
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人