上一篇实现了窗口移动以及最大化最小化,本章将要实现与服务器的连接
本章内容
- 服务器搭建
- 客户端与服务器的连接
- 客户端收发消息
服务器搭建
在本专题的第一篇文章《Qt实现仿微信在线聊天工具(服务器、客户端)V1_ 01》中创建了服务器工程,这里实现服务器的基本功能。
首先这里要用到Qt的网络编程方面的知识,不太熟悉的小伙伴建议先去学习一下。
主要用到的是Tcp、Udp,对应的Qt模块是 “Network”
由于服务器在这里的功能主要是接收客户端发送过来的消息,处理并转发给对应单位,可能是其他用户,也可能是原客户端的回执
这里的服务器界面设计比较简单,主要是为了回显客户端发过来的消息,方便开发调试
看下.h文件
#pragma once
#include <QMainWindow>
#include <qtcpserver.h>
#include "ui_MyChatToolServer.h"
#include <qtcpsocket.h>
#include <QTimer>
class MyChatToolServer : public QMainWindow
{
Q_OBJECT
public:
MyChatToolServer(QWidget *parent = nullptr);
~MyChatToolServer();
private slots:
//创建服务器按钮对应的槽函数
void slotStartServer();
//响应客户端连接请求的槽函数
void onNewConnection();
//接收客户端聊天消息的槽函数
void onReadyRead();
//转发聊天消息给其它客户端的槽函数
void sendMessage(const QByteArray&);
//定时器检查客户端套接字是否为正常连接状态的槽函数
void onTimeout(void);
//void sendMsg(const QByteArray&, QList<QTcpSocket*> targets);
private:
//void handleLoginMsg(QByteArray buf, QTcpSocket*);
Ui::MyChatToolServerClass ui;
QTcpServer tcpServer;//TCP服务器
quint16 port;//服务器端口,quint16-->unsigned short
QList<QTcpSocket*> tcpClientList;//容器:保存和客户端通信的套接字
//QMap<QString, QTcpSocket*> m_mapTcpSockets; //保存用户id到对应套接字的映射
QTimer timer;//定时器,定时检查容器中和客户端通信的套接字是否为正常连接状态
};
.cpp文件
#include "MyChatToolServer.h"
#include <qmessagebox>
#include <QDebug>
MyChatToolServer::MyChatToolServer(QWidget *parent)
: QMainWindow(parent)
{
ui.setupUi(this);
connect(ui.btnStartServer, &QPushButton::clicked, this, &MyChatToolServer::slotStartServer, Qt::UniqueConnection);
}
MyChatToolServer::~MyChatToolServer()
{
}
//创建服务器按钮对应的槽函数
void MyChatToolServer::slotStartServer()
{
//获取服务器端口
port = 8080;
//设置监听服务器的IP和端口
//QHostAddress::Any ==> QHostAddress("0.0.0.0");
if (tcpServer.listen(QHostAddress::Any, port) == false) {
QMessageBox::information(nullptr, "failed", QString::fromLocal8Bit("创建服务器失败"));
return;
}
else {
QMessageBox::information(nullptr, "success", QString::fromLocal8Bit("创建服务器成功"));
//当有客户端向服务器发送连接请求时,发送信号newConnection
connect(&tcpServer, SIGNAL(newConnection