Joynet

项目地址:https://github.com/IronsDu/Joynet

介绍

high performance network library for lua, based on https://github.com/IronsDu/accumulation-dev and lua coroutine. Joynet 的网络底层使用多线程,但Lua (层面)是运行在单线程上。

借助协程提供同步形式的API。(同步的socket api,同步的http api,同步的redis api)

让应用业务开发更轻松,更爽!

src 目录是此项目源代码, libs 目录为基于此Lua协程网络库开发的一些库

构建

  • Windows : 在项目根目录中打开 Joynet.sln, 编译即可在当前目录产生可执行文件 Joynet
  • Linux : 在项目根本执行 make 即可生成可执行文件 Joynet

使用

examples 包含测试代码。 譬如我们要在Windows下运行PingPong测试: 先在项目根目录执行 Joynet examples\PingpongServer.lua,然后执行 Joynet examples\PingpongClient.lua

一个小问题

当前Joynet是作为一个宿主程序,由其运行业务Lua文件。 不过我们能轻松的把它作为动态库集成到已有的应用系统里。

关于协程

协程是轻量级线程,所以多线程有的问题它也有,只是影响程度不同。 在协程中使用同步API会阻塞当前协程,所以当你的应用程序只有一个协程从外部收取网络消息时,且在消息处理中使用同步API 操作Redis或者Http的话,效率会很低。 这时有两个方案可解决:1 、提供回调形式的异步API, 但这样会使开发概念混乱 ; 2、 在前面说到的情景的消息处理中开启协程,并在其中操作HTTP/Redis,而不是直接在消息处理所在协程中进行操作。 (当然,协程的创建和切换有一定开销,所以~看着办吧 ^-^ )

例子:

PingpongServer.lua:

package.path = "./src/?.lua;./libs/?.lua;"

local TcpService = require "TcpService"
local AcyncConnect = require "Connect" local totalRecvNum = 0 function userMain() --开启服务器
local serverService = TcpService:New()
serverService:listen("0.0.0.0", 9999) coroutine_start(function()
while true do
local session = serverService:accept()
if session ~= nil then
coroutine_start(function ()
local strLen = 5 --读取5个字节
while true do
local packet = session:receive(strLen)
if packet ~= nil then
totalRecvNum = totalRecvNum + 1
session:send(packet)
end
if session:isClose() then
break
end
end
end)
end
end
end) coroutine_start(function ()
while true do
coroutine_sleep(coroutine_running(), 1000)
print("total recv :"..totalRecvNum.."/s")
totalRecvNum = 0
end
end)
end coroutine_start(function ()
userMain()
end) while true
do
CoreDD:loop()
while coroutine_pengdingnum() > 0
do
coroutine_schedule()
end
end

  PingPongClient.lua:

package.path = "./src/?.lua;./libs/?.lua;"

local TcpService = require "TcpService"
local AcyncConnect = require "Connect" local totalRecvNum = 0 function userMain() --开启10个客户端
local clientService = TcpService:New()
clientService:createService() for i=1,1 do
coroutine_start(function ()
local session = clientService:connect("127.0.0.1", 9999, 5000) if session ~= nil then
local str = "hello"
local strLen = string.len(str) session:send(str)
while true do
local packet = session:receive(strLen)
if packet ~= nil then
totalRecvNum = totalRecvNum + 1
session:send(packet)
end if session:isClose() then
break
end
end
else
print("connect failed")
end
end)
end coroutine_start(function ()
while true do
coroutine_sleep(coroutine_running(), 1000)
print("total recv :"..totalRecvNum.."/s")
totalRecvNum = 0
end
end)
end coroutine_start(function ()
userMain()
end) while true
do
CoreDD:loop()
while coroutine_pengdingnum() > 0
do
coroutine_schedule()
end
end

  

Http Server :

package.path = "./src/?.lua;./libs/?.lua;"

local TcpService = require "TcpService"

local totalRecvNum = 0

function userMain()
if true then
--开启http服务器
local serverService = TcpService:New()
serverService:listen("0.0.0.0", 80)
coroutine_start(function()
while true do
local session = serverService:accept()
if session ~= nil then
coroutine_start(function () --读取报文头
local packet = session:receiveUntil("\r\n") --读取多行头部
while true do
packet = session:receiveUntil("\r\n")
if packet ~= nil then
if #packet == 0 then
--print("recv empty line")
break
end
end
end local htmlBody = "<html><head><title>This is title</title></head><body>hahaha</body></html>"
local response = "HTTP/1.1 200 OK\r\nConnection: close\r\nContent-Type: text/html\r\nContent-Length: "..string.len(htmlBody).."\r\n\r\n"..htmlBody session:send(response) totalRecvNum = totalRecvNum + 1
end)
end
end
end) coroutine_start(function ()
while true do
coroutine_sleep(coroutine_running(), 1000)
print("total recv :"..totalRecvNum.."/s")
totalRecvNum = 0
end
end)
end coroutine_start(function ()
userMain()
end) while true
do
CoreDD:loop()
while coroutine_pengdingnum() > 0
do
coroutine_schedule()
end
end

  

跨平台高效率Lua网络库 ( 同步形式的API ,底层是异步非阻塞)的更多相关文章

  1. Java网络编程和NIO详解5:Java 非阻塞 IO 和异步 IO

    Java网络编程和NIO详解5:Java 非阻塞 IO 和异步 IO Java 非阻塞 IO 和异步 IO 转自https://www.javadoop.com/post/nio-and-aio 本系 ...

  2. java的高并发IO原理,阻塞BIO同步非阻塞NIO,异步非阻塞AIO

    原文地址: IO读写的基础原理 大家知道,用户程序进行IO的读写,依赖于底层的IO读写,基本上会用到底层的read&write两大系统调用.在不同的操作系统中,IO读写的系统调用的名称可能不完 ...

  3. [INet] I/O模型:同步阻塞,同步非阻塞,异步非阻塞

    POSIX 把这同步.异步两个术语定义 如下: 同步 I/O 操作( synchronous I/O opetation) 导致请求进程阻塞, 直到 I/O 操作完成: 异步 I/O 操作( asyn ...

  4. [Boost基础]并发编程——asio网络库——同步socket处理

    网络通信简述 asio库支持TCP,UDP和ICMP通信协议,它在名字空间boost::asio::ip里提供了大量的网络通信方面的函数和类,很好的封装了原始的Berkeley Socket API, ...

  5. 阻塞I/O、非阻塞I/O和I/O多路复用、怎样理解阻塞非阻塞与同步异步的区别?

    “阻塞”与"非阻塞"与"同步"与“异步"不能简单的从字面理解,提供一个从分布式系统角度的回答.1.同步与异步 同步和异步关注的是消息通信机制 (syn ...

  6. 简明网络I/O模型---同步异步阻塞非阻塞之惑

    转自:http://www.jianshu.com/p/55eb83d60ab1 网络I/O模型 人多了,就会有问题.web刚出现的时候,光顾的人很少.近年来网络应用规模逐渐扩大,应用的架构也需要随之 ...

  7. 网络I/O模型---同步异步阻塞非阻塞之惑

    网络I/O模型 人多了,就会有问题.web刚出现的时候,光顾的人很少.近年来网络应用规模逐渐扩大,应用的架构也需要随之改变.C10k的问题,让工程师们需要思考服务的性能与应用的并发能力. 网络应用需要 ...

  8. python网络编程基础(线程与进程、并行与并发、同步与异步、阻塞与非阻塞、CPU密集型与IO密集型)

    python网络编程基础(线程与进程.并行与并发.同步与异步.阻塞与非阻塞.CPU密集型与IO密集型) 目录 线程与进程 并行与并发 同步与异步 阻塞与非阻塞 CPU密集型与IO密集型 线程与进程 进 ...

  9. 谈谈对不同I/O模型的理解 (阻塞/非阻塞IO,同步/异步IO)

    一.关于I/O模型的问题 最近通过对ucore操作系统的学习,让我打开了操作系统内核这一黑盒子,与之前所学知识结合起来,解答了长久以来困扰我的关于I/O的一些问题. 1. 为什么redis能以单工作线 ...

随机推荐

  1. java.io.IOException: Messenger was closed

    程序运行一段时间后抛出异常java.io.IOException: Messenger was closed,不知道是啥原因? ———————————————————————————————————— ...

  2. 题目连接:http://acm.zznu.edu.cn/problem.php?id=1329

    题目大意: 定理:把一个至少两位的正整数的个位数字去掉,再从余下的数中减去个位数的5倍.当且仅当差是17的倍数时,原数也是17的倍数 . 例如,34是17的倍数,因为3-20=-17是17的倍数:20 ...

  3. 几种连接不同数据库的ADO.NET字符串

    Data Source=myServerAddress;Initial Catalog=myDataBase;User Id=myUsername;Password=myPassword;或者 Ser ...

  4. [转]Android在初始化时弹出popwindow的方法 .

    转自:http://blog.csdn.net/sxsboat/article/details/7340759 留个人备用0.0 Android中在onCreate()时弹出popwindow,很多人 ...

  5. WEB数据挖掘(十三)——关联规则与序列模式(1)

    一.Apriori算法简介:  Apriori算法是一种挖掘关联规则的频繁项集算法,其核心思想是通过候选集生成和情节的向下封闭检测两个阶段来挖掘频繁项集. Apriori(先验的,推测的)算法应用广泛 ...

  6. hdoj 5417 Victor and Machine

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5417 水题,一开始题目读错了做了好久,每次停工以后都是重新计时. 需要注意的是,先除后乘注意加括号 # ...

  7. oracle 空值与 null

    Oracle中的空字符串基本上是被当成空NULL来处理的,我们可以从下面的得到印证. select nvl('','NULL') from dual          返回 'NULL' select ...

  8. js全局变量

    在做东钿微信公众号 ,首页有房产评估和产调,有个checkbox ,点击则选中使用积分,取消选中则不使用积分,html结构和css样式都一样,唯一不一样的就是数据不一样,于是我就分开来写,没有写同一个 ...

  9. SharePoint 2013 自定义翻页显示列表项

    项目需求:自定义开发一个能分页显示列表项的小部件,允许左右翻页,能根据用户权限来显示管理链接等. 效果如下: 技术要求:使用sharepoint rest API 来获取列表项,这样性能高,能够快速响 ...

  10. java(2014版)连接数据库的工具类

    package util; import java.io.IOException; import java.sql.Connection; import java.sql.DriverManager; ...