这个项目只实现了固定的好友对话,在linux虚拟机中实现
客户端界面设计
服务端的实现
头文件
widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QTcpServer>
#include <QTcpSocket>
#include <mythread.h>
#include <QDebug>
#include <QMessageBox>
typedef struct clients
{
QTcpSocket *socket;
QString nameid;
QString name;
}_clients;
Q_DECLARE_METATYPE(clients)//通过Q_DECLARE_METATYPE声明后,就可以让自定义的类型设置到QVariant。
extern _clients userclients[4];
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
signals:
void sendToThread(QByteArray b);
private slots:
void newClientHander();
void threadslot(QByteArray b);
private:
Ui::Widget *ui;
QTcpServer *server;
public:
};
#endif // WIDGET_H
mythread.h
#ifndef MYTHREAD_H
#define MYTHREAD_H
#include <QObject>
#include <QWidget>
#include <QThread>
#include <QTcpSocket>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QSqlError>
#include "widget.h"
class mythread : public QThread
{
Q_OBJECT
public:
explicit mythread(QTcpSocket *s);
void run();
bool connectDb(QString& errorMsg);
void disconnectDb();
void loginDemo(QString message);
void sendToDbDemo(QString message);
void beoffDemo(QString message);
void statusDemo();
signals:
void sendToWidget(QByteArray b);
private:
QString id;
QString dbName;
QSqlDatabase db;
QTcpSocket *socket;
QSqlDatabase dbConnected;
public slots:
void clientInfoSlot();
void statusToClient(QByteArray b);
void disconnectsocket();
};
#endif // MYTHREAD_H
监听端口,接收信号创建线程
server=new QTcpServer;
server->listen(QHostAddress::AnyIPv4,8000);//监听端口号8000
connect(server,&QTcpServer::newConnection,this,&Widget::newClientHander);//接收信号
void Widget::newClientHan