使用QT5与NodeJS建立基本socket通讯

非常简单的代码,实现了基本功能,不过还是尝试过一些弯路的,在此记录一下。

服务端选择NodeJS,因为是现在的主流,容易开发和部署。客户端使用QT5的VS版本,易于开发用户界面。

1、服务端代码:

var net = require('net');

var chatServer = net.createServer();

chatServer.on('connection', function(client) {//连接

client.on('data', function(data) {//客户端发送数据,服务端接收数据同时向客户端返回一些数据

console.log('data: ' + data);

// 这里进行各种处理

client.write('Hello, ' + data);

});

});

chatServer.listen(8800);//服务器启动,监听端口

没有过多可说的,网上一大堆例子。我还没有处理断线动作,没有处理error,只是实现了最基本的连接及与客户端互相通信。

需要注意的是服务器可能限制了端口,如果是linux服务器,需要查看并设置iptables(Centos7没有使用iptables,而要设置firewalld防火墙)

2、客户端代码:

void my_client::on_login_button_clicked()

{

bool is_connected = true;

if (NULL == tcp_socket)

{

tcp_socket = new QTcpSocket(this);

tcp_socket->abort();//网上统一都有这么一句,我也不知道原因,没有深究

tcp_socket->connectToHost(server_ip, server_port.toInt(), QTcpSocket::ReadWrite);

connect(tcp_socket, SIGNAL(readyRead()), this, SLOT(readMessage()));

is_connected = tcp_socket->waitForConnected();

}

if (is_connected)

{

QString client_msg("{\"name\":\"" + usr_name + "\",\"pwd\":\"" + usr_pwd + "\"}");//JSON字符串,我还没有开始用QT自带的JSON,先这样临时处理一下

tcp_socket->write(client_msg.toStdString().c_str());

tcp_socket->waitForBytesWritten();

}

else

{

QMessageBox::about(NULL, QStringLiteral("连接"), QStringLiteral("连接") + "\nname:" + usr_name + "\nip:" + server_ip);//QStringLiteral是个用于在QT界面显示中文的宏,否则会显示乱码。我试用了设置全局编码没有成功。

void my_client::readMessage()

{

QString server_msg = tcp_socket->readAll();

QMessageBox::about(NULL, QStringLiteral("连接成功"), QStringLiteral("连接成功") + "\nmsg:" + server_msg);

}

这个还是踩了几个坑的。

(1)要在依赖中添加库。Properties->Linker->Input->Additional Dependencies,添加Qt5Networkd.lib。这是指在vs下,创建项目时没有选择添加网络依赖的情况。在创建新项目时,如果选择了网络依赖,这里就不用改了。如果是非vs,修改系统文件,网上可以找到方法。如果不这么做,会有无法解决external link的情况。

(2)socket连接之后,要使用如下代码进行信号和槽的连接:

connect(tcp_socket, SIGNAL(readyRead()), this, SLOT(readMessage()));

这里有一个小坑,就是在头文件定义readMessage()时,需要明确添加slots宏,像这样:

private slots:

void readMessage();

否则会无法正确触发。

(3)接收数据在网上有几种方法,我分别尝试后,只有这种方法成功了:

QString server_msg = tcp_socket->readAll();

其它方法大概还是我没设置好,没有仔细研究。

不管怎么说,目前可以做到客户端和服务器间互相收发消息,算是最最基本的通讯功能实现了,后续可以开始做框架设计、业务性开发、优化等等工作了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容