vs利用qt插件实现局域网聊天室

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");

}

此处项目以全部完成,点击运行编译即可

原文地址:https://www.cnblogs.com/szmtjs10/p/14640445.html