WebSocket

首先新建一个空的文件夹,通过npm安装nodejs-websocket:

1
npm install nodejs-websocket


新建app.js文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
var ws = require("nodejs-websocket");
ws.createServer(function(conn){
    conn.on("text", function (str) {
        console.log("get the message: "+str);
        conn.sendText("the server got the message");
    })
    conn.on("close", function (code, reason) {
        console.log("connection closed");
    });
    conn.on("error", function (code, reason) {
        console.log("an error !");
    });
}).listen(8001);


通过node app.js启动,这样服务器就搭建好了。


Cocos2d-x

首先在头文件中include头文件:

1
#include "network/WebSocket.h"


实现WebSocket的委托:

1
class HelloWorld : public cocos2d::Layer,public cocos2d::network::WebSocket::Delegate


四个委托中定义的函数接口以及一个用来连接的socketClient对象:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
// for virtual function in websocket delegate
virtual void onOpen(cocos2d::network::WebSocket* ws);
virtual void onMessage(cocos2d::network::WebSocket* ws, const cocos2d::network::WebSocket::Data& data);
virtual void onClose(cocos2d::network::WebSocket* ws);
virtual void onError(cocos2d::network::WebSocket* ws, const cocos2d::network::WebSocket::ErrorCode& error);
 
// the websocket io client
cocos2d::network::WebSocket* _wsiClient;
初始化client:
_wsiClient = new cocos2d::network::WebSocket();
_wsiClient->init(*this"ws://localhost:8001");
在cpp文件中实现这些函数:
// 开始socket连接
void HelloWorld::onOpen(cocos2d::network::WebSocket* ws)
{
    CCLOG("OnOpen");
}
 
// 接收到了消息
void HelloWorld::onMessage(cocos2d::network::WebSocket* ws, const cocos2d::network::WebSocket::Data& data)
{
        std::string textStr = data.bytes;
        textStr.c_str();
        CCLOG(textStr.c_str());
}
 
// 连接关闭
void HelloWorld::onClose(cocos2d::network::WebSocket* ws)
{
    if (ws == _wsiClient)
    {
        _wsiClient = NULL;
    }
    CC_SAFE_DELETE(ws);
    CCLOG("onClose");
}
 
// 遇到错误
void HelloWorld::onError(cocos2d::network::WebSocket* ws, const cocos2d::network::WebSocket::ErrorCode& error)
{
    if (ws == _wsiClient)
    {
        char buf[100] = {0};
        sprintf(buf, "an error was fired, code: %d", error);
    }
    CCLOG("Error was fired, error code: %d", error);
}


还有一个使用SocketIO的方案(本文作者只提供了源码,但是尚未测试,您可以与作者一起测试,并可以提供反馈):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
// Require HTTP module (to start server) and Socket.IO
var http = require('http'), io = require('socket.io');
 
// Start the server at port 8080
var server = http.createServer(function(req, res){ 
 
    // Send HTML headers and message
    res.writeHead(200,{ 'Content-Type''text/html' }); 
    res.end('<h1>Hello Socket Lover!</h1>');
});
server.listen(8080);
 
// Create a Socket.IO instance, passing it our server
var socket = io.listen(server);
 
// Add a connect listener
socket.on('connection', function(client){ 
 
    // Create periodical which ends a message to the client every 5 seconds
    var interval = setInterval(function() {
        client.send('This is a message from the server!  ' new Date().getTime());
    },5000);
 
    // Success!  Now listen to messages to be received
    client.on('message',function(event){ 
        console.log('Received message from client!',event);
    });
    client.on('disconnect',function(){
        clearInterval(interval);
        console.log('Server has disconnected');
    });
 
});