在遊戲客戶端使用luasocket做爲網絡通訊的手段, 有一點很蛋疼, 就是它的receive是阻塞的, 那界面就卡死在那裏了, 不過有一個函數:settimeout(), 傳入參數0, 表示若是沒有數據就當即返回. 因此就在能夠在主循環裏面不停的調用receive()這個函數. 不過I/O的開銷那不是通常的高, 很是高!linux
其實我想要的東西很簡單, 異步接收, 有數據到了, 調用指定的回調函數來處理. 另一個就是, 跨平臺, windows, linux, android, ios ...... 其實能夠使用libevent, 可是感受在C端libevent太龐大了. 好了, 不扯了, 這種I/O開銷還在能夠承受的範圍以內. 代碼以下:android
package.path = "./frameworks/cocos2d-x/external/lua/luasocket/?.lua" local socket = require ("socket") local client = false; if not socket then print("load socket module failed.") else print("success load socket module.") local host = "127.0.0.1" local port = 34561 client = socket.connect4(host, port) if not client then print("connect server failed.") else client:send("this is lua client!"); client:settimeout(0); end end function receive_message() if client then local recvstr, err = client:receive(); print("recvstr, err:", recvstr, err); end end