一、了解TCP的通信过程

Qt中封装了TCP协议 QTcpServer类负责服务端:

1、创建QTcpServer对象

2、监听listen需要的参数是地址和端口号

3、当有新的客户端连接成功时会发射newConnection信号

4、在newConnection信号的槽函数中,调用nextPendingConnection函数获取新的连接QTcpSocket对象

5、连接QTcpSocket对象的readyRead信号

6、在readyRead信号的槽函数使用read接收数据

7、调用write成员函数发送数据

QTcpSocket负责客户端

1、创建qTcpSocket对象

2、当对象与Server连接成功时会发射connected信号

3、调用成员函数connectToHost连接服务器,需要的参数是地址和端口号

4、connected信号的槽函数中开启发送数据

5、使用write发送数据,read接收数据

二、实现多人聊天室

支持多人聊天(多个客户端)

每个客户端不仅能显示自己发的,还能收到别的客户端发的

服务端收到所有客户端发的

关键代码

client:

//widget.h

#ifndef WIDGET_H

#define WIDGET_H

#include #include namespace Ui {

class Widget;

}

class Widget : public QWidget

{

Q_OBJECT

QTcpSocket* tcpSocket;

public:

explicit Widget(QWidget *parent = 0);

~Widget();

private slots:

void on_send_clicked();

void connect_success();

void read_data();

private:

Ui::Widget *ui;

};

#endif // WIDGET_H

//widget.cpp

#include "widget.h"

#include "ui_widget.h"

#includeWidget::Widget(QWidget *parent) :

QWidget(parent),

ui(new Ui::Widget)

{

ui->setupUi(this);

tcpSocket = new QTcpSocket;

tcpSocket->connectToHost("192.168.43.4",1234);

connect(tcpSocket,SIGNAL(connected()),this,SLOT(connect_success()));

}

Widget::~Widget()

{

delete ui;

}

void Widget::on_send_clicked()

{

std::string msg = ui->msg->text().toStdString();

int ret = tcpSocket->write(msg.c_str(),msg.size()+1);

qDebug("--send:%d--",ret);

ui->msg->setText("");

}

void Widget::connect_success()

{

qDebug("success");

ui->send->setEnabled(true);

connect(tcpSocket,SIGNAL(readyRead()),this,SLOT(read_data()));

}

void Widget::read_data()

{

char buf[256]={};

tcpSocket->read(buf,sizeof(buf));

ui->textEdit->append(buf);

}

server:

//widget.h

#ifndef WIDGET_H

#define WIDGET_H

#include #include #include #include using namespace std;

namespace Ui {

class Widget;

}

class Widget : public QWidget

{

Q_OBJECT

QTcpServer* tcpServer;

vectorsocketArr;

public:

explicit Widget(QWidget *parent = 0);

~Widget();

public slots:

void new_connect();

void read_data();

//void send_data();

private:

Ui::Widget *ui;

};

#endif // WIDGET_H

//widget.cpp

#include "widget.h"

#include "ui_widget.h"

Widget::Widget(QWidget *parent) :

QWidget(parent),

ui(new Ui::Widget)

{

ui->setupUi(this);

tcpServer = new QTcpServer;

tcpServer->listen(QHostAddress("192.168.43.4"),1234);

connect(tcpServer,SIGNAL(newConnection()),this,SLOT(new_connect()));

}

Widget::~Widget()

{

delete ui;

}

void Widget::new_connect()

{

qDebug("--new connect--");

QTcpSocket* tcpSocket = tcpServer->nextPendingConnection();

connect(tcpSocket,SIGNAL(readyRead()),this,SLOT(read_data()));

socketArr.push_back(tcpSocket);

}

void Widget::read_data()

{

for(int i=0; ibytesAvailable())

{

char buf[256] = {};

socketArr[i]->read(buf,sizeof(buf));

char buf2[256] = {};

sprintf(buf2,"%d:%s",i,buf);

ui->textEdit->append(buf2);

for(int j=0; jwrite(buf1,sizeof(buf1));

}

}

}

}

linux多人聊天室 qt,Qt编程详解--网络通信之基于TCP的多人聊天室相关推荐

  1. C#Socket编程详解(一)TCP与UDP简介

    一.TCP与UDP(转载) 1.TCP 1.1 定义 TCP(TransmissionControl Protocol)传输控制协议. 是一种可靠的.面向连接的协议(eg:打电话).传输效率低全双工通 ...

  2. 【转】C#Socket编程详解(一)TCP与UDP简介

    一.TCP与UDP 1.TCP 1.1 定义 TCP(TransmissionControl Protocol)传输控制协议. 是一种可靠的.面向连接的协议(eg:打电话).传输效率低全双工通信(发送 ...

  3. Linux网络编程——基于tcp/ip的模拟聊天(文件传输)工具

    开发平台:Linux 开发工具:Ubuntu, sourceInsight4.0 项目介绍: 本项目基于TCP/IP协议创建一个网络通信系统,可以实现客户之间的聊天通信以及文件传输,同时利用进程实现多 ...

  4. 基于TCP的网络实时聊天室(socket通信案例)

    开门见山 一.数据结构Map 二.保证线程安全 三.群聊核心方法 四.聊天室具体设计 0.用户登录服务器 1.查看当前上线用户 2.群聊 3.私信 4.退出当前聊天状态 5.离线 6.查看帮助 五.聊 ...

  5. Java进阶:基于TCP的网络实时聊天室(socket通信案例)

    目录 开门见山 一.数据结构Map 二.保证线程安全 三.群聊核心方法 四.聊天室具体设计 0.用户登录服务器 1.查看当前上线用户 2.群聊 3.私信 4.退出当前聊天状态 5.离线 6.查看帮助 ...

  6. Qt pro 文件详解

     Qt pro 文件详解 1. TEMPLATE  变量TEMPLATE描述了为建立目标文件而采用何种模板,即生成何种形式的Makefile文件.Qmake  工具定义了5种模板:   a. 应用 ...

  7. Qt 5.12--Item详解

    Qt 5.12--Item详解 1 作为容器 2 默认属性 3 透明度 4 堆叠顺序 5 定位子项目和坐标映射 参考 QML中的所有可视项目都继承自Item.虽然Item本身没有可视化的外观,但是它定 ...

  8. Linux网络编程---详解TCP

    Linux网络编程---详解TCP的三次握手和四次挥手_shanghx_123的博客-CSDN博客_tcp的协议数据单元被称为 TCP协议详解(TCP报文.三次握手.四次挥手.TIME_WAIT状态. ...

  9. Linux串口编程详解

    Linux串口编程详解(阻塞模式.非阻塞模式.select函数) 之前一直觉得串口编程很简单,这两天仔细研究后发现串口里的各种参数还挺复杂,稍不注意就容易出错,这里总结一下网上的各种文章及自己的理解与 ...

最新文章

  1. 样本不平衡不均衡数据处理
  2. 微服务架构实践之缓存
  3. 2018年视觉所有干货博文的分类汇总
  4. 'imread' was not declared in this scope
  5. 成功解决Exception “unhandled ModuleNotFoundError“No module named ‘sklearn.neighbors.classification‘
  6. CVPR 2020 《Local-Global Video-Text Interactions for Temporal Grounding》论文笔记
  7. rpm安装两个mysql_MySQL通过rpm安装及其单机多实例部署
  8. 如何做好工程监理控制工作?
  9. 算法 --- 求两个集合的并集
  10. C++ —— C++常量和变量
  11. Vue (响应式原理-模拟-2-Observer)
  12. 无法安装数据库关系图支持对象的解决方法
  13. 记一次基于公众号的微信H5开发项目(一)
  14. php 极光推送别名数组,PHP使用极光推送-Go语言中文社区
  15. Navicat Premium 连接 MongoDB 失败: Cannot connect to MongoDB.No suitable servers found: ......
  16. 【Python数据分析】二手车价格预测
  17. Shell入门之管道
  18. 怎么把计算机管理的磁盘找出来,电脑分区显示不出来怎么办
  19. 通过Debugx5在电脑端调试微信页面
  20. 关于下载表格数据乱码的解决方案

热门文章

  1. 如何在latex中引用文献
  2. 主流的四种IM(IM:instant messaging,即时消息)协议
  3. GitHub开源游戏框架和引擎介绍
  4. qt 二次开发 研华daq_在QT项目中添加对研华数采模块的支持
  5. 三维激光扫描后处理软件_GEO3D科技 | 三维激光扫描在城市及建筑测量上的应用...
  6. 基于ssm校园招聘管理系统获取(java毕业设计)
  7. Wex5 开发工具及相关插件安装
  8. 三星电子将在中国建芯片工厂
  9. catia二次开发:函数是否需要加括号 ,type类型 ,出现未定义变量类型错误,怎么破, 背景色设置 ,检查模块是否封闭 ,几何图形集是否存在某一个元素
  10. 软件项目开发报价(一)