Lua异步socket实现LuaSocketEvent开源啦

Lua异步socket实现
LuaSocketEvent开源啦!!! https://github.com/dotcoo/LuaSocketEvent

终于可以抛弃WebSocket协议了,轻装上阵,轻松自如.

使用介绍:

服务器端

使用nc模拟 nc -l 8888

客户端

在main.lua第一行引入LuaSocketEvent

require("socketevent")


```


创建链接

-- 创建一个tcp链接
local sock = socketevent.tcp()

-- 注册事件
sock:on("connect", function(event)
    print("connect")
end)

sock:on("data", function(event)
    print("data: " .. event.data)
end)

-- sock:on("message", function(event)
--     print("data: " .. event.data)
-- end)

sock:on("close", function(event)
    print("close!")
end)

sock:on("error", function(event)
    print("error: " .. event.error .. ", " .. event.message)
end)

-- 链接服务器
sock:connect("127.0.0.1", 8888)

-- 发送数据
print("send: hello server")
sock:send("hello server\n")

-- 防止程序直接退出
-- sock:wait()

```


data事件是接收到的原始数据.
message事件接收到的是完整消息.

message与data不同的是消息经过粘包处理,格式为4字节的消息头部和消息内容.

看了起来不错。比较自己调用 httpclint 有什么优势么?

测试发现时 阻塞的,意义不大啊。而且不能使用网址。

阻塞??? 不会啊,专门针对cocos2d-lua做的非阻塞的. 不要调用wait方法,就不会阻塞了
使用-i参数可以使 脚本运行完成不退出

lua -i socket.lua 

```

直接执行lua代码来发送数据
sock.send("hello server")

```


域名支持 嗯 很好的建议 计划这周末支持

socket是双通道的 具体优势就不多说了 没什么好比较的

是吗。那应该是我填写的ip连不上,所以第一次 connect 会阻塞,直到超时,然后回调。没有nc模拟服务器,只是尝试直接连接我们自己的游戏服务器。确实会卡在sock:connect 这里。

而且完善的话建议: 可以自己设置里面的 各种超时时间。这样看起来更加完美了。那我想我可以抛弃 curl库 直接试试这个啦。

收藏一下 后续研究!

貌似楼主有更新了下?我git下了最新的,发现 新增了

local option = {
    keepalive = 1,
    keepidle = 60,
    keepintvl = 10,
    keepcnt = 30,
}

sock:setOption(option)

看起来是超时的设置是吗?

而且还添加了 域名支持?

但是随便试了下 http://www.baidu.com 80 貌似不能连接成功 (貌似自己写的socket是可以连上它的?)

以下测试 connect 速度

【1】
1.time = 0.835
2.time = 0.835
003: 0
error: 1, remote host does not exist!
3.time = 1.912
send: hello server
4.time = 1.912
error: -1, send data failure!
5.time = 1.979

以上是网络畅通,ip正确,端口错误的connect执行时间,需要1秒多阻塞在主线程。

【2】
1.time = 0.794
2.time = 0.794
connect
3.time = 0.82
send: hello server
4.time = 0.82
5.time = 0.821

以上是网络畅通,ip正确,端口正确的connect执行时间,时间上看0.03秒左右

【3】
1.time = 0.774
2.time = 0.774
003: 0
error: 1, remote host does not exist!
3.time = 21.784
send: hello server
4.time = 21.784
error: -1, send data failure!
5.time = 21.845

这是错误的域名,错误的端口,连接的时间。这就有点恐怖了····

【4】
1.time = 0.773
2.time = 0.773
error: 1, domain not found!
3.time = 0.773
send: hello server
4.time = 0.773
error: -1, send data failure!
5.time = 0.774

这是写网址的连接情况。

希望楼主可以改进呀~~~

代码贴上来 我看看

楼主,我想把你的代码绑定到lua上,但是vs编译出了这种错误

这种语法错误,看看没有问题的啊

我找到原因了,
纯c要求局部变量定义必须在函数或局部空间的开头,然后才能有其他语句。
纯c确实对变量声明的位置有要求,c++却可以随用随定义的。 说明vs是严格执行了纯C的标准。
变量任意定义是c99的标准。
我改成.cpp就可以了,郁闷,我学艺不精

楼主这个socketevent是异步非阻塞的吗?

是的 使用的时候如果有什么不足可以提出来 我及时调整

楼主,问你个问题,我把你的socketevent在win32下可以运行,但是我想在安卓手机上调试就报错



需要怎么特殊做的吗?

LZ 最新的 怎么编译不通过呀,检查一下?都报分号不对什么的

楼主,上面的问题我自己解决了,但是现在我想从外网来访问我局域网的服务器,在tp-link里面设置了虚拟服务器功能

然后客户端填的是我家外网的ip,这样理论上可以连上的了吧?

原来 我在公司用 vs2012 就产生哪些分号的错误,在家里用vs2013就可以编译通过了···无语,顺便提一下,最新的代码如图这里报错,win32 找不到 hstrerror

还有测试了下,如果乱填ip地址,或者该ip地址能ping通,但是端口错误,都会导致 connect超时~

print("1.time = " .. os.clock())

if sock:connect("192.168.0.1", 80) ~= 1 then
    print("3.time = " .. os.clock())
end

print("2.time = " .. os.clock())

1.time = 0.709
error: 0. message: No error.
3.time = 21.715
2.time = 21.715

难道是 用win32 库的问题?

理论上是可以的

路由器 运行状态 -> WAN口状态 -> IP地址 你连接的是这个ip地址嘛?
检查一下 这个ip地址和ip138.com显示的你的ip地址是不是一样的

好的 我改下 感谢支持