当前位置: 首页 > 工具软件 > node-qt > 使用案例 >

node.js服务端和QT客户端简单Socket通讯

薛承志
2023-12-01

很久没写博客了,最近在做一个项目,服务端要用到node.js。客户端用QT来开发。这两种新兴的东西,资料少之又少,一个简单的socket通讯,几乎花了我一周多的时间来完成。遇到了各种各样的问题就不说了(都是泪),直接贴正确的代码,边贴边解释。

首先是服务端:

var net = require('net');
var DanmuServer = net.createServer();
DanmuServer.on('connection',function(client){
	client.on('data',function(data){
		console.log('Socket textData:' + data.toString());
	});
	client.on('end',function(){
		console.log("断开连接");
	});
	client.write('Hello,client!This is Server!');
});
DanmuServer.listen(8081);
console.log("Socket server running at http://127.0.0.1:8081");
服务端代码很简单,大概流程就是创建服务器,监听8081端口。当监听到有客户端连接后。通过socket.on来监听来自客户端发来的信息和断开指令。听到data后向后台打印出data的内容,听到end信号后,打印“断开连接”。然后通过socket.write向客户端发送信息。

客户端代码如下:

textTcpSocket = new QTcpSocket();
textTcpSocket -> abort();
textTcpSocket->connectToHost("127.0.0.1", 8081);
if(textTcpSocket->waitForReadyRead(1000)){
        QByteArray s = textTcpSocket->readAll();
        QString ss = QVariant(s).toString();
        ui->textEdit_rec->setText(ss);
}
QByteArray textData = "Hello,server!This is Client!";
textTcpSocket->write(textData);
textTcpSocket->close();
先说一下我之前卡了很久的一个错误吧,之前没有利用waitForReadyRead来进行阻塞,而是直接利用readAll函数来读取socket中的数据。发现总是报错,报错内容大概就是read is not called(记不太确定了)。接着,我用windows自带的telnet功能直接访问我的node.js文件,发现可以成功接收到服务端传递的消息。然后我想了一下,大概原因是,程序直接执行readAll函数从socket中读取数据,可是此时服务端的数据还没有发送过来,因此,读取的时候没有读到东西。导致服务端和客户端都报错。然后就是心酸的各种修改,包括利用QT特色槽函数什么的来接收服务端的readyread信号,再调用相应的槽函数,但是也无济于事,哎,其他的修改过程也就不说了。

给大家逐行解释一下客户端的代码吧。首先QTcpSocket是QT中自带的一个类库。它具体的一些函数什么的,打开QT,按F1可以自行查看。这里创建一个QTcpSocket的对象,textTcpSocket,然后利用connectToHost函数连接服务端,地址为127.0.0.1,端口号为8081。然后最重要的一步就是利用waitForReadyRead信号对程序进行阻塞。监听Socket中是否有可读的内容,有就返回True,参数1000是等待1000毫秒的意思。然后当发现有可读的内容后利用readAll函数对其读取,并将其内容显示在textEdit控件中。下面的代码就是向服务端发送对应的消息,接着断开连接,并向服务端发送“end”信号。

 类似资料: