2014-06-25 47 views
0

套接字不像HTTP没有什么是req, res它始终是这样的:当有流上的数据套接字连接server2server

client.on('data', function(data)... 

事件被执行。

现在我想做一个服务器2服务器通信。我正在写一个游戏,我将拥有一台主服务器,并且这台主服务器与游戏桌面客户端进行通信。

一台服务器是世界服务器,另一台服务器是登录服务器。客户端直接连接到世界服务器,如果数据是登录数据,则世界服务器将其传递到登录服务器。

但我不能笼络我的头周围如何做到这一点在节点。正如前面Webdev的我只能想:

login.send(dataToSendToOtherServer, function(responseOfOtherServer) { 
    if (responseOfOtherServer === 1) 
    client.write(thisDataIsGoingToTheDesktopClient) 
}) 

所以,我该怎么做这样的事情在node.js的插座?

我想是这样的:

Client.prototype.send = function(data, cb) { 
    // convert json to string 
    var obj = JSON.stringify(data) 
    this.client.write(obj) 

    // wait for the response of this request 
    this.client.on('data', function(req) { 
    var request = JSON.parse(req) 

    // return response as callback 
    if (data.type === request.type) cb(request) 
    }) 

} 

但有了这个每个请求的响应得+1。

回答

1

因为你正在处理普通的TCP/IP,你需要拿出你自己的更高级别的协议来指定如何确定消息何时完成(因为TCP不能保证它将全部到达一口吞下)。处理这个问题的常见方法是:

  • 固定长度消息:缓冲接收到的数据,直到长度合适为止。
  • 为长度计数的每个消息添加前缀:缓存接收的数据,直到达到指定的长度。
  • 指定某些字符或序列作为消息结束指示符:缓冲接收到的数据,直至以该序列/字符结尾。

在你的情况,你可以缓冲收上来的数据,直到JSON.parse成功所积累的数据,假设每个消息由法律JSON的。

+0

是的,我的数据包在第一个字节处有数据包的总长度。我现在可以做什么? – majidarif

+0

nodejs上逻辑的任何示例源代码? – majidarif

+0

其实JSON部分就是例子。我的真实数据是一个缓冲区。 protobuf的。 – majidarif