自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

原创 skynet教程(2)--项目代码独立于skynet源码结构

作者:shihuaping0918@163.com,转载请注明作者目前大部人使用skynet进行开发的时候,都是直接在skynet的源码目录下直接开发的。这样有一个不好的地方就是,自己的代码和skynet本身的代码混在一起,项目交接或者是有新成员加入的时候,比较容易迷惑,到底哪些文件才是我要关注的。如果不是对skynet进行二次开发,对skynet进行扩展。仅仅是使用它,完全是可以项目独立于skyn

2017-09-02 09:06:20 1546 2

原创 skynet教程(1)--服务的编写

作者:shihuaping0918@163.com,转载请注明作者自从skynet源码分析系列文章发布以后,陆续收到不少的反馈,说需要一个step by step的教程,身边的朋友也要求出个教程。于是就写了这个教程。每个教程都是从hello world开始的,所以先写一个echo服务作为hello world版本。echo服务先放在skynet/example这个目录下,因为配置相关的东西还没有讲

2017-09-02 08:20:29 8357 1

原创 skynet教程(0)--skynet的获取和编译

作者:shihuaping0918@163.com,转载请注明作者本篇作为skynet的开篇,主要是介绍skynet基本环境的搭建以及知识储备。怎么获取skynet的源码,怎么编译。目前的skynet版本是1.1,是云风最近一次发布的。本篇只涉及linux下的环境搭建,不介绍windows下的相关内容,windows下要搭建请自行google。机器环境准备:linux/mac一台。git客户端安装好

2017-09-02 08:19:28 1013

原创 pomelo源码分析(8)--session

作者:shihuaping0918@163.com,转载请注明作者pomelo中有session/frontendSession/backendSession/sessionService。名字看起来都有点像,这一篇准备讲session和sessionService。session是对用户连接的一个抽象,它会调用sessionService。sessionService是session的具体实现底层

2017-08-27 19:45:47 560

原创 pomelo源码分析(7)--connector与其它组件交互

作者:shihuaping0918@163.com,转载请注明作者connector是一个重量级组件,它依赖connection/server/pushScheduler/session组件。 对session组件的依赖是对连接创建一个session。 对connection的依赖是连接数的增加减少,以及登录用户uid的管理。 对pushScheduler的依赖是,当异步发送时,把发送任务放到

2017-08-27 19:44:37 338

原创 pomelo源码分析(6)--connector协议处理message

作者:shihuaping0918@163.com,转载请注明作者pomelo框架核心提供了sioconnector,udpconnector,hybirdconnector,mqttconnector。sioconnector基于socket.io,使用json通信,pc端通信。hybirdconnector基于tcp和websocket,使用二进制通信,主要用于手机端通信。mqttconnect

2017-08-26 22:38:20 1523

原创 pomelo源码分析(5)--node.js中的this

作者:shihuaping0918@163.com,转载请注明作者在继续分析代码之前,需要先讲一下node.js中的this是什么。因为不讲这个的话,后面的内容进行不下去。在以前版本的node.js中,全局this是个空对象,在node8的repl中,全局this和global是相等的。> this === globaltrue> 但是,如果使用node8执行js文件,全局this是个空对象。c

2017-08-26 22:36:30 208

原创 pomelo源码分析(4)--connector之网络监听

作者:shihuaping0918@163.com,转载请注明作者pomelo的connector负责接收外部连接,同时做协议的编码解码,接收的时候做解码,发送的时候做编码。如果有对消息进行加密的话,也是在这里进行处理。有unicode的话,还要转码成utf8。connector的网络处理是基于事件的,这也符合node.js的设计。connector是一个component,根据pomelo的约定,

2017-08-26 15:52:22 898

原创 pomelo源码分析(3)--配置设置和读取及app.load

作者:shihuaping0918@163.com,转载请注明作者以https://github.com/NetEase/chatofpomelo/tree/master/game-server服务器为例子来说明配置读取是怎么完成的,chatofpomelo是pomelo做为聊天服务器的例子。它的入口点是app.js。代码内容如下:var pomelo = require('pomelo');va

2017-08-26 13:05:57 1115

原创 skynet源码分析(11)--skynet的配置加载

作者:shihuaping0918@163.com,转载请注明作者skynet中的源码已经分析得差不多了,还有启动过程没有分析。skynet的配置文件是以lua格式来写的。使用过skynet的都清楚skynet的启动命令是skynet config_file_name。配置文件名是作为命令行参数传给skynet进程的。skynet进程启动以后,会读取config文件,然后解析这个lua文件。然后把相

2017-08-22 21:08:14 465

原创 skynet源码分析(10)--消息机制之消息注册和回调

作者:shihuaping0918@163.com,转载请注明作者在第5篇和第6篇已经分析过消息的发送和消息的处理,但是没有谈到消息回调函数的注册,还有消息回调的详细过程。第9篇已经讲了一部分消息的回调处理。skynet中的回调对C服务和对LUA服务的注册机制是不同的,C服务的回调可以直接挂载。但是lua服务不行,它必须经过一次中转。这个在第9篇中谈到过,但是第9篇主要是介绍lua c api的协议

2017-08-21 21:23:53 551

原创 skynet源码分析(9)--LUA C API

作者:shihuaping0918@163.com,转载请注明作者这篇文章是分析skynet消息注册前的知识准备,skynet的消息注册,C服务和lua服务设置回调走的函数是不同的。C的回调可以直接调,但是lua的回调不行,它需要一个默认的回调C函数,将返回参数转换为lua能理解的格式,遵循lua的api协议,传递到lua层。这个回调的名字叫_cb。具体它是怎么工作的我们下一篇再分析,这一篇要先了解

2017-08-21 18:58:11 332

原创 skynet源码分析(8)--skynet的网络

作者:shihuaping0918@163.com,转载请注明作者 网络部分是一个服务器最基础最核心的部分,这个技术也已经是非常成熟了,现在已经很少有人自己实现一个网络相关的库了。skynet的网络库是自己实现的。网络底层的技术在windows上是完成端口(IOCP),在linux上是EPOLL,在mac/freebsd上是kqueue。这些技术都是能够承载高负载高并发网络请求的。IOCP和EPO

2017-08-21 12:56:56 640

原创 skynet源码分析(7)--skynet中的timer

skynet的timer是做游戏用得比较频繁的一个功能,分析一下它的源码还是有意义的。而且核心的C源码除了timer和网络以外,已经基本分析得差不多了。其它都是跟lua c api相关,或者是跟lua交互比较多的。timer的源码在skynet-timer.c和skynet-timer.h中。在开始看代码之前,请大家默念三遍:1秒=1000毫秒1毫秒=1000微秒1微秒=1000纳秒然后

2017-08-21 10:41:50 694

原创 skynet源码分析(6)--消息机制之消息分发

作者:shihuaping0918@163.com,转载请注明作者第5篇讲到了消息的处理,消息的处理实际上就是对工作队列里的消息不停地调回调函数。那么消息是怎么放进消息队列的呢。带着这个疑问,让我们从lua层开始追根溯源。在lua层有两个api,一个是skynet.send,这个是非阻塞发消息。另一个是skynet.call,这个是阻塞式发完消息等回应。skynet.call使用一个sessi

2017-08-21 10:41:47 507

原创 skynet源码分析(5)--消息机制之消息处理

作者:shihuaping0918@163.com,转载请注明作者skynet的消息机制准备拆成三个部分来讲,第一部分是接收处理,第二部分是分发,第三部分是消息注册。顺序是倒过来的讲的,我觉得这样更容易被人接受理解。顺过来讲会有一个问题就是,讲到a时,可能牵扯到b.c.d,而b.c.d可能又牵扯到c.d.e,不讲呢又会留下疑惑,讲的话呢又很容易陷入细节的泥潭。干脆就倒过来讲好了。skynet是

2017-08-21 10:41:44 537

原创 skynet源码分析(4)--monitor

作者:shihuaping0918@163.com,转载请注明作者skynet对服务的监控做得比较简陋,从设计原则上来说,这样做也是对的,因为框架层能做的,基本就是上报和打日志,上层的业务是变化万千的,不论怎么写,都可能满足不了上层的业务需求。skynet中对服务的监控实现在skynet_monitor.c和skynet_monitor.h中,当服务可能陷入死循环的时候,就打一条日志。具体日志内

2017-08-21 10:41:41 1035

原创 skynet源码分析(3)--消息名字和ID之handle

作者:shihuaping0918@163.com,转载请注明作者消息机制是skynet中一个比较难理解的东西,在开始分析代码前,建议先读一下云风的博客和skynet的WIKI。SKYNET设计综述:http://blog.codingnow.com/2012/09/the_design_of_skynet.html,CLUSTER:https://github.com/cloudwu/skyn

2017-08-21 10:41:38 549

原创 skynet源码分析(2)--消息队列mq

作者:shihuaping0918@163.com,转载请注明作者消息队列是skynet的核心功能之一,它的功能说白了就是入队出队,先进先出,这个数据结构都有讲过。源码实现在skynet.h和skynet.c中。下面来看一下这两个文件。#ifndef SKYNET_MESSAGE_QUEUE_H#define SKYNET_MESSAGE_QUEUE_H#include #includ

2017-08-21 10:41:35 427

原创 skynet源码分析(1)--模块加载

作者:shihuaping0918@163.com,转载请注明作者两个月前接触skynet,最初使用的时候过程是相当痛苦的,而且网络上可以找到的学习资料并不多。当时决定写一些skynet相关的文章,最近终于有空了,开始写这个东西。skynet是云风开源的一个游戏框架,底层是c,中间层和上层都是lua。基于actor模型,使用消息队列进行内部通信。万丈高楼平地起,先开始看最底层的内容吧,因为上层

2017-08-21 10:41:32 629

原创 python使用scrapy爬表格,爬虫中级

上一篇讲道了爬虫入门,这一篇介绍怎么使用爬虫框架来爬数据。框架用的是scrapy https://doc.scrapy.org/en/latest/。在开始动手之前,还是建议大家用pyenv和virtualenv隔离一下环境。当然如果觉得麻烦的话可以略过。先把环境切到3.5.3,然后再切换包环境。我系统是没有安装scrapy的,所以要进行下面这两步。安装了scrapy的忽略它。看不明白我在说什么

2017-08-21 10:41:29 566

原创 python试爬李毅吧贴子标题,爬虫最初级

注:以下所有python代码均运行于2.7.0最近想抓点数据存起来,开始捣鼓python。爬虫技术以前没接触过,这一回就当练手,从零开始,从最原始的方式开始。先定个小目标,抓一下著名的“李毅吧”的一些贴子标题。要爬数据,第一步肯定是网络请求,在这里主要是指get/post请求。第二步是对返回的html进行解析。第三步是从解析后的DOM树里取我们想要的东西。在这些步骤进行之前,要先安装lxml

2017-08-21 10:41:26 244

原创 python居家旅行必备的pyenv,virtualenv

不论是java还是c++,都有库依赖的问题,c++中叫dll hell,java中也有类似的现象,java也存在不同版本编译的runtime报错问题。既然这些语言都有,那么python也不例外,只是python的现象更严重一些。2.x和3.x语法不兼容,库依赖就更不兼容了。而linux和mac osX都有预装的python版本,如果不注意的话,就会出现程序A依赖库Lib1,而程序B依赖库Lib2,

2017-08-21 10:41:24 331

原创 HTTP/2服务端推送

翻译:shihuaping0918@163.com【译者注:本文需要有一定的HTTP协议知识和浏览器解析页面过程知识】原文 :https://blog.golang.org/h2push前言HTTP/2被设计为解决HTTP/1.x的许多缺陷。当代网页使用了许多资源:HTML、样式表、脚本、图片等等。在HTTP/1.x中这些资源每一个都必须明确地请求。这可能是一个很慢的过程。浏览器从获取HT

2017-08-21 10:41:21 3319

原创 CAP理论——分布式基础理论

要说明CAP理论,首先要了解C/A/P三个到底是什么意思,C代表Consistency,按照wiki的解释是(Every read receives the most recent write or an error),简单的说就是数据一致性。A代表Availability(Every request receives a (non-error) response – without guaran

2017-08-21 10:41:18 220

原创 twitter的snowflake算法

snowflake算法是twitter提出的一个用来生成不重复ID的算法,用于解决ID冲突。适用于:先插数据,然后根据id更新数据。还有分布式多机同时取ID。这个算法本身并不复杂,它的原理是根据时间(ms)来不断更新ID。ID由64bit组成,分为workerId、datacenterId、timestamp(ms)、sequence四部分。其中workerId占5个bit,datacenter

2017-08-21 10:41:15 199

原创 mysql导数据遇到错误提示ERROR 1227,Acess denied

作者:天一阁图书管理员今天群里有前同事在问mysqldump出来的sql文件在导入的时候,报错error1227(42000)at line 18: Acess denied; you need (at least one of) the SUPER privilege(s) for this operation定位到18行显示的是一个这样的语句: set @@session.sql_log_

2017-08-21 10:41:13 21317

原创 字符集GBK,GB2312,GB18030,UNICODE,UTF-8

作者:天一阁图书管理员最近使用python导数据,从一个latin1的数据库导到另一个latin1的数据库,遇到像“漩偑”这样的字符的时候简直是痛不欲生。怎么导怎么报错,如果忽略转码错误又会出现缺少字符的情况。花了几天时间才完全解决这个问题,至于是怎么解决的需要另写一篇python的文章来解释了。还是先练一下基本功吧......计算机一开始是只支持ascii码表的。而Latin1在ascii的

2017-08-21 10:41:10 159

原创 小心stringstream.str()字符串用法的陷阱

在编写应用程序时,我们经常要使用到字符串。C++标准库中的和为我们操作字符串提供了很多的方便,例如:对象封装、安全和自动的类型转换、直接拼接、不必担心越界等等。但今天我们并不想长篇累牍得去介绍这几个标准库提供的功能,而是分享一下stringstream.str()的一个有趣的现象。我们先来看一个例子: #include #include #include using

2017-08-21 10:41:07 1210 1

提示
确定要删除当前文章?
取消 删除