当前仓库属于关闭状态,部分功能使用受限,详情请查阅 仓库状态说明
1 Star 3 Fork 1

thomas/Qt tcp server
关闭

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
mainwindow.cpp 2.49 KB
一键复制 编辑 原始数据 按行查看 历史
zhangxuechao 提交于 2018-08-22 12:32 . 支持tcp多连接,实测可行
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QTcpSocket>
const quint16 PORT = 12345;
const int DATA_STREAM_VERSION = QDataStream::Qt_4_6;
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
//初始化服务器server对象
mServer = new QTcpServer();
//关联客户端连接信号newConnection
connect(mServer, SIGNAL(newConnection()), this, SLOT(new_client())); //连接客户端
//启动服务器监听
mServer->listen(QHostAddress::Any, PORT);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::new_client()
{
qDebug()<<"new_client here";
TcpInfo tcpInfo;
QTcpSocket *mSocket = mServer->nextPendingConnection();//与客户端通信的套接字
tcpInfo.mSocket = mSocket;
vTcpInfo.append(tcpInfo);
//关联接收客户端数据信号readyRead信号(客户端有数据就会发readyRead信号)
connect(mSocket,SIGNAL(readyRead()),this,SLOT(read_client_data()));
//检测掉线信号
connect(mSocket,SIGNAL(disconnected()),this,SLOT(client_dis()));
/* socket出错 -> 出错处理 */
connect(mSocket, SIGNAL(error(QAbstractSocket::SocketError)),
this, SLOT(show_error(QAbstractSocket::SocketError)));
}
TcpInfo MainWindow::tcpInfoGet(QTcpSocket *socket)
{
int i = 0;
QVector<TcpInfo>::iterator iter;
for (iter = vTcpInfo.begin(); iter != vTcpInfo.end(); iter++)
{
if(iter->mSocket == socket)
{
iter->index = i;
return *iter;
}
i++;
}
}
void MainWindow::cleanConnect(QTcpSocket *socket)
{
TcpInfo tcpInfo = tcpInfoGet(socket);
vTcpInfo.remove(tcpInfo.index);
}
/* 首部 = 用户名 + 文件名 + 总大小 + 用户名长度 + 文件名长度*/
void MainWindow::read_client_data()
{
qDebug() << "read_client_data here";
//可以实现同时读取多个客户端发送过来的消息
QTcpSocket *receive = (QTcpSocket*)sender();
if(receive->bytesAvailable() > 0)
{
QByteArray array = receive->readAll();
qDebug() << array;
}
}
void MainWindow::client_dis()
{
QTcpSocket *obj = (QTcpSocket*)sender();//掉线对象
obj->close();
cleanConnect(obj);
qDebug()<<obj->peerAddress().toString();//打印出掉线对象的ip
}
/*--- 出错处理 ---*/
void MainWindow::show_error(QAbstractSocket::SocketError)
{
QTcpSocket *obj = (QTcpSocket*)sender();
qDebug() << obj->errorString();
obj->close(); // 关cocket
}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/gitee.thomas/Qt-tcp-server.git
[email protected]:gitee.thomas/Qt-tcp-server.git
gitee.thomas
Qt-tcp-server
Qt tcp server
master

搜索帮助