【Pomelo】 tcp 连接测试
发布于 3 年前 作者 gocpplua 1695 次浏览 来自 分享

Pomelo tcp 连接测试

接着上一讲《Pomelo点击:Test Game Server 按钮后流程》。

pomelo提供了hybirdconnector和sioconnector,hybirdconnector支持TCP、WebSocket,sioconnector支持socket.io

我们创建项目的时候,选择的是: 1 for websocket(native socket),那么项目还是可以支持tcp连接的,我们这边就使用原项目测试。

测试tcp的话,我们只要启动game-server即可:

$> polemo start

启动日志中我们主要关注clientPort和port,其中clientPort是用来监听客户端的连接,port端口用来给后端提供服务。

[2021-05-20 20:30:02.478] [INFO] pomelo - [/data/gocpplua/pomelo/pomelo_prj/HelloWorld/game-server/node_modules/pomelo/lib/master/starter.js] Executing /home/SENSETIME/chenqi1/.nvm/versions/node/v14.16.1/bin/node --inspect=127.0.0.1:16772,/data/gocpplua/pomelo/pomelo_prj/HelloWorld/game-server/app.js,env=development,id=connector-server-1,host=127.0.0.1,port=3150,clientHost=127.0.0.1,clientPort=3010,frontend=true,args= --inspect=127.0.0.1:16772,serverType=connector locally

然后使用nc(全名叫 netcat)工具,充当客户端,去连接3010端口。

我当时去发送数据的数据,调试了很一会,因为不知道tcp对应的包的格式,以及如何在命令行发送16进制数据,那这边我就直接剧透了吧。

  • 一、协议

假设我发送的数据如下:

{“sys”:1}

那么对应16进制:

\x7b\x22\x73\x79\x73\x22\x3a\x31\x7d

这边需要注意:

  1. 需要是Json数据
  2. 数据中需要"sys"字段
  3. 发送的数据格式说明 第1字节 第2~4字节  第5字节以及其后 协议类型 数据长度   数据

所以,我们最后组装出来的数据就是:

“\x01\x00\x00\x09\x7b\x22\x73\x79\x73\x22\x3a\x31\x7d”

  • 二、十六进制发送

我们可以将十六进制写到文件中发送,也可以在终端发送,我以终端为例:

$> echo -n -e "\x01\x00\x00\x09\x7b\x22\x73\x79\x73\x22\x3a\x31\x7d" | nc 1
27.0.0.1 3010

服务器返回数据:

{“code”:200,“sys”:{“heartbeat”:3,“dict”:{“connector.entryHandler.entry”:1,“connector.entryHandler.publish”:2,“connector.entryHandler.subscribe”:3},“routeToCode”:{“connector.entryHandler.entry”:1,“connector.entryHandler.publish”:2,“connector.entryHandler.subscribe”:3},“codeToRoute”:{“1”:“connector.entryHandler.entry”,“2”:“connector.entryHandler.publish”,“3”:“connector.entryHandler.subscribe”},“dictVersion”:“vhs1TJfFaUAZcUaS9t3zTQ==”,“useDict”:true,“protos”:{“server”:{},“client”:{},“version”:“xT9OvpsqULwrUv2IpdUD4Q==”},“useProto”:true}}

如果你打算自己Debug的话,可以在tcpsocket.js中的ondata函数中添加断点,函数如下:

var ondata = function(socket, chunk) {
  if(socket.state === ST_CLOSED) {
    throw new Error('socket has closed');
  }

  if(typeof chunk !== 'string' && !Buffer.isBuffer(chunk)) {
    throw new Error('invalid data');
  }

  if(typeof chunk === 'string') {
    chunk = new Buffer(chunk, 'utf8');
  }

  var offset = 0, end = chunk.length;

  while(offset < end && socket.state !== ST_CLOSED) {
    if(socket.state === ST_HEAD) {
      offset = readHead(socket, chunk, offset);
    }

    if(socket.state === ST_BODY) {
      offset = readBody(socket, chunk, offset);
    }
  }

  return true;
};

具体如何生成工程和调试,请参照前面两篇文章。

回到顶部