1、概述
本程序利用了Visual Studio 2010中寄存了qt5.5插件,利用qt5.5插件实现了局域网的聊天的功能,其中程序分为服务器端和客户端,利用服务器端开启服务器,客户端进行连接服务器,实现客户端和服务器端消息传递,多个客户端实现局域网聊天的功能。
2、效果
3、实现步骤
3.1、下载软件
切记:下载qt插件软件必须和Visual Studio版本相匹配。
qt插件:
链接:https://pan.baidu.com/s/1CWeMZTl4sxvKUoIn0ZWyLQ
提取码:1593
qt软件:
链接:https://pan.baidu.com/s/1kOz-DYku4jRtXozQ_kAtyQ
提取码:1593
Visual Studio 2010:
链接:https://pan.baidu.com/s/1butkXJfPOIUjPohZLxWLDQ
提取码:1593
3.2、安装软件
3.2.1、安装qt软件(qt-opensource-windows-x86-msvc2010-5.5.0)
3.2.2、安装VS2010旗舰版.iso
双击VS2010旗舰版.iso, 打开以下界面,选择autorun.exe
因为我已经安装了vs2010软件,此处不再截屏分享,更具流程点击下一步即可,除开选择安装路径,不需要做任何修改。
3.3.3、安装qt插件
双击qt插件(qt-vs-addin-1.2.4-opensource)
此处我已安装,系统会检测出已安装,所以也不作为截屏分享,按照安装流程,除安装路径可选择修改,其他均可以不做任何修改,点击下一步,安装即可。
4、配置环境
4.1、双击已安装的vs2010程序
4.3、选择qt库文件
5、新建项目
新建服务器项目
最后点击Finish完成
6、编辑页面、编写服务器代码
在编辑之前先编译,方便生成*.h文件的同时,以防出错
6.1、双击如下图文件
出现以下页面,利用控件编辑出以下页面
6.2、代码编辑
6.2.1头文件代码
#ifndef LANCHAR_H
#define LANCHAR_H
#include <QtWidgets/QDialog>
#include "ui_lanchar.h"
#include <QTcpServer>
#include <QTcpSocket>
#include <QHostAddress>
#include <QMessageBox>
class lanChar : public QDialog
{
Q_OBJECT
public:
lanChar(QWidget *parent = 0);
~lanChar();
private:
//初始化server操作
void initServer();
public slots:
void on_button_start_server_clicked();
void on_button_set_news_clicked();
void on_button_connect_server_clicked();
void sltSocketRead();
private:
//创建全局服务器对象
//存储已连接的socket对象
//存取已连接的用户
QList<QTcpSocket*> clientList;
//创建服务器对象
QTcpServer *server;
//socket对象
QTcpSocket *client;
Ui::lanCharClass ui;
};
#endif // LANCHAR_H
6.2.3、cpp中代码
#include "lanchar.h"
#include <winsock.h>
lanChar::lanChar(QWidget *parent)
: QDialog(parent)
{
ui.setupUi(this);
client = NULL;
}
lanChar::~lanChar()
{
}
void lanChar::initServer()
{
}
//开启服务器按钮
void lanChar::on_button_start_server_clicked(){
//创建Server对象
server = new QTcpServer(this);
//获取ip地址
const QString address_text=ui.lineEdit_address->text();
const QHostAddress address=(address_text=="Any")
?QHostAddress::Any
:QHostAddress(address_text);
//获取端口号
const unsigned short port=ui.lineEdit->text().toUShort();
//开始监听,并判断是否成功
if(server->listen(address,port)){
//连接成功就将输入框提示服务器已开启
ui.textRecv->append("The server is turned on");
}
connect(server, &QTcpServer::newConnection,[this](){
//取出建立好连接的套接字
client = server->nextPendingConnection();
clientList.append(client);
ui.textRecv->append(QString("[%1:%2] Soket Connected")
.arg(client->peerAddress().toString())
.arg(client->peerPort()));
//QString li=client->peerAddress().toString();
QObject::connect(client, SIGNAL(readyRead()), this, SLOT(sltSocketRead()));
});
//QObject::connect(client, SIGNAL(readyRead()), this, SLOT(sltSocketRead()));
}
void lanChar::on_button_set_news_clicked(){
const QString get_data=ui.lineEdit_3->text();
//判断是否开启了server
if(!server->isListening())
return;
if (get_data==""){
QMessageBox::about(NULL, "About","没有输入任何语句");
return;
}
const QByteArray send_data=get_data.toUtf8();
QTcpSocket *socket=server->nextPendingConnection();
ui.textEdit_set_news->append(get_data);
for(int i = 0; i < clientList.count(); i++)
{
socket = clientList.at(i);
socket->write(send_data);
}
socket->flush();
}
void lanChar::on_button_connect_server_clicked(){
server->close();
ui.textRecv->append("The server is down!");
for(int i = 0; i < clientList.count(); i++)
{
client->disconnectFromHost();
if(client->state()!=QAbstractSocket::UnconnectedState){
client->abort();
}
}
}
void lanChar::sltSocketRead()
{
ui.textEdit_get_news->append(client->readAll());
}
此处服务器端代码编写完成
7、开始编辑客户端代码
客户端和服务器端一样创建项目文件,编辑页面
7.1、以下为头文件代码
#ifndef QWE_H
#define QWE_H
#include <QtWidgets/QDialog>
#include "ui_qwe.h"
#include <QTcpServer>
#include <QTcpSocket>
#include <QHostAddress>
#include <QMessageBox>
class qwe : public QDialog
{
Q_OBJECT
public:
qwe(QWidget *parent = 0);
~qwe();
public slots:
void on_pushButton_clicked();
void on_pushButton_2_clicked();
void on_pushButton_3_clicked();
private:
QList<QTcpSocket*> clientList;
//socket对象
QTcpSocket *client;
Ui::qweClass ui;
};
#endif // QWE_H
7.2、以下为cpp文件代码
#include "qwe.h"
qwe::qwe(QWidget *parent)
: QDialog(parent)
{
ui.setupUi(this);
}
qwe::~qwe()
{
}
void qwe::on_pushButton_clicked(){
/*连接服务器*/
//实例化QtcpSocket对象
client = new QTcpSocket(this);
//连接服务器的ip
const QString address=ui.lineEdit_2->text();
//服务器的端口号
const unsigned short port=ui.lineEdit->text().toUShort();
//连接
client->connectToHost(address,port);
/*if(!(client->state()==QAbstractSocket::ConnectedState))
ui.lineEdit_2->setText("The server is turned on");*/
/*读取服务器消息*/
connect(client,&QTcpSocket::readyRead,[=]{
//没有可读的数据就返回
if(client->bytesAvailable()<=0)
return;
//注意收发两端文本要使用对应的编解码
const QString recv_text=QString::fromUtf8(client->readAll());
ui.textEdit->append(recv_text);
});
}
void qwe::on_pushButton_2_clicked(){
const QString get_data=ui.lineEdit_3->text();
ui.textEdit_2->append(get_data);
const QByteArray send_data=get_data.toUtf8();
client->write(send_data.data());
}
void qwe::on_pushButton_3_clicked(){
client->disconnectFromHost();
client->close();
ui.textEdit->append("Server Disconnected");
}
此处项目以全部完成,点击运行编译即可