非常简单的代码,实现了基本功能,不过还是尝试过一些弯路的,在此记录一下。
服务端选择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();
其它方法大概还是我没设置好,没有仔细研究。
不管怎么说,目前可以做到客户端和服务器间互相收发消息,算是最最基本的通讯功能实现了,后续可以开始做框架设计、业务性开发、优化等等工作了。