QT--TCP网络编程(客户端/服务器)
QT -----TCP网络编程
1.主要流程
1.客户端
创建QTcpSocket对象
连接到服务器 --connectToHost()
发送数据 ---write()
读取数据 ---readAll()
断开连接
2.服务器
创建QTcpServer 对象
绑定本地信息---listen(QHostAddress::Any,端口)
等待客户端连接---newConnection()
读取数据
发送数据
断开连接
2.头文件
客户端:#include < QTcpSocket >
服务器:#include < QTcpServer >
必须要在pro文件加上-----QT += core gui network
3.代码
1.客户端
widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QtNetwork/QTcpSocket>
#include <QKeyEvent>
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
private:
QTcpSocket *client;
QString *message;
void keyPressEvent(QKeyEvent *event);
public:
explicit Widget(QWidget *parent = nullptr);
~Widget();
private:
Ui::Widget *ui;
};
#endif // WIDGET_H
widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include <QTextEdit>
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
client = new QTcpSocket(this);
ui->Button_send->setEnabled(false);
/* 连接服务器 */
connect(ui->Button_connection,&QPushButton::released,this,
[=]()
{
client->connectToHost(ui->lineEdit_ip->text(),ui->lineEdit_d->text().toInt());
});
/* 连接成功 */
connect(client,&QTcpSocket::connected,this,
[&]()
{
ui->Button_send->setEnabled(true);
ui->label_prompt->setText("已连接");
ui->textEdit_receive->append("连接成功……");
});
/* 发送到服务器 */
connect(ui->Button_send,&QPushButton::released,this,
[&]()
{
QString data = ui->textEdit_edit->toPlainText();
if(data.length() > ) //如果输入框不为空才可以发送
{
client->write(data.toUtf8());
QString data1 = "已发送:"+data;
ui->textEdit_receive->append(data1);
}
else {
ui->textEdit_receive->append("输入信息");
}
});
/* 接收信息 */
connect(client,&QTcpSocket::readyRead,this,
[&]()
{
QString msg = "收到:" + client->readAll();
ui->textEdit_receive->append(msg);
});
/* 断开连接 */
connect(ui->Button_disconnect,&QPushButton::released,this,
[=]()
{
client->disconnectFromHost();
ui->Button_send->setEnabled(false);
});
/* 断开连接 */
connect(client,&QTcpSocket::disconnected,this,
[&]()
{
ui->label_prompt->setText("未连接……");
ui->textEdit_receive->append("断开连接……");
});
}
/* 键盘事件:捕获按下回车键发送---这一部分可选择不要 */
void Widget::keyPressEvent(QKeyEvent *event)
{
int key = event->key();
if(key == Qt::Key_Enter)
{
QString data = ui->textEdit_edit->toPlainText();
if(data.length() > )
{
client->write(data.toUtf8());
QString data1 = "已发送:"+data;
ui->textEdit_receive->append(data1);
}
else {
ui->textEdit_receive->append("输入信息");
}
}
}
Widget::~Widget()
{
delete ui;
}
2.服务器
widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QtNetwork/QTcpServer>
#include <QtNetwork/QTcpSocket>
#include <QKeyEvent>
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
QTcpServer *server;
QTcpSocket *socket;
void new_client();
void send_data();
void read_data();
void disconnect();
void keyPressEvent(QKeyEvent *event); //重写键盘事件虚函数,如果不要键盘发 //送可选择删掉
public:
explicit Widget(QWidget *parent = nullptr);
~Widget();
private:
Ui::Widget *ui;
};
#endif // WIDGET_H
widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
ui->Button_send->setEnabled(false);
server = new QTcpServer(this);
/* 绑定绑定信息 */
server->listen(QHostAddress::Any,ui->lineEdit_d->text().toInt());
/* 等待客户端连接 */
connect(server,&QTcpServer::newConnection,this,&Widget::new_client);
/* 发送信息 */
connect(ui->Button_send,&QPushButton::released,this,&Widget::send_data);
}
/* 等待连接 */
void Widget::new_client()
{
qDebug() << "新客户连接";
ui->label_prompt->setText("已连接");
ui->textEdit_log->append("连接成功");
ui->Button_send->setEnabled(true);
socket = server->nextPendingConnection();
connect(socket,&QTcpSocket::readyRead,this,&Widget::read_data);
connect(ui->Button_disconnect,&QPushButton::released,socket,&QTcpSocket::disconnectFromHost);
connect(socket,&QTcpSocket::disconnected,this,
[&]()
{
ui->textEdit_log->append("断开连接");
});
}
/* 发送信息 */
void Widget::send_data()
{
QString data = ui->textEdit_edit->toPlainText();
if(data.length() > ) //如果输入栏不为空才可以发送
{
socket->write(data.toUtf8());
QString data1 = "已发送:" + data;
ui->textEdit_log->append(data1);
}
else {
ui->textEdit_log->append("输入信息");
}
}
/* 接收信息 */
void Widget::read_data()
{
// QTcpSocket *obj = (QTcpSocket*)sender();
QString msg = "收到:" + socket->readAll();
ui->textEdit_log->append(msg);
}
/* 断开连接 */
void Widget::disconnect()
{
ui->textEdit_log->append("断开连接");
ui->Button_send->setEnabled(false);
}
/* 回车键发送 ----- 可选择不要 */
void Widget::keyPressEvent(QKeyEvent *event)
{
int key = event->key();
if(key == Qt::Key_Enter)
{
QString data = ui->textEdit_edit->toPlainText();
if(data.length() > ) //如果输入栏不为空才可以发送
{
qDebug() << data.length();
socket->write(data.toUtf8());
QString data1 = "已发送:" + data;
ui->textEdit_log->append(data1);
}
else {
ui->textEdit_log->append("输入信息");
}
}
}
Widget::~Widget()
{
delete ui;
}
4.布局
- 客户端

- 服务器

QT--TCP网络编程(客户端/服务器)的更多相关文章
- QT TCP网络编程
首先介绍一下TCP:(Transmission Control Protocol 传输控制协议)是一种面向连接的.可靠的.基于字节流的传输层通信协议.相比而言UDP,就是开放式.无连接.不可靠的传输层 ...
- TCP网络编程-----客户端请求连接服务器、向服务器发数据、从服务器接收数据、关闭连接
SOCKET m_sockClient; unsigned short portNum; ------------------------------------------------------- ...
- Ubuntu上Qt+Tcp网络编程之简单聊天对话框
首先看一下实现结果: >>功能: (1)服务器和客户端之间进行聊天通信: (2)一个服务器可同时给多个客户端发送消息:(全部连接时) 也可以只给特定的客户端发送消息:(连接特定IP) ...
- Linux下TCP网络编程与基于Windows下C#socket编程间通信
一.linux下TCP网络编程基础,需要了解相关函数 Socket():用于套接字初始化. Bind():将 socket 与本机上的一个端口绑定,就可以在该端口监听服务请求. Listen():使s ...
- JAVA TCP网络编程学习笔记
一.JAVA网络编程概述 网络应用程序,就是在已实现网络互联的不同计算机上运行的应用程序,这些程序之间可以相互交换数据.JAVA是优秀的网络编程语言,Java网络编程的类库位于java.net包中.J ...
- 【Linux网络编程】TCP网络编程中connect()、listen()和accept()三者之间的关系
[Linux网络编程]TCP网络编程中connect().listen()和accept()三者之间的关系 基于 TCP 的网络编程开发分为服务器端和客户端两部分,常见的核心步骤和流程如下: conn ...
- TCP网络编程
TCP网络编程 与UDP不同的是TCP是通过客服端和服务端的方式来传输数据的.客服端:public class TCPClient { /** * @param args * @th ...
- 简述TCP网络编程本质
基于事件的非阻塞网络编程是编写高性能并发网络服务程序的主流模式,头一次使用这种模式编程需要转换思维模式 .把原来的"主动调用recv()来接收数据,主动调用accept()来接受连接,主动调 ...
- Java - TCP网络编程
Java - TCP网络编程 Server 逻辑思路: 创建ServerSocket(port),然后服务器的socket就启动了 循环中调用accept(),此方法会堵塞程序,直到发现用户请求,返回 ...
随机推荐
- 前端API层架构,也许你做得还不够
上午好,今天为大家分享下个人对于前端API层架构的一点经验和看法.架构设计是一条永远走不完的路,没有最好,只有更好.这个道理适用于软件设计的各个场景,前端API层的设计也不例外,如果您觉得在调用接口时 ...
- 使用JSCH执行命令并读取终端输出的一些使用心得
使用Jsch执行命令,并读取终端输出 jsch http://www.jcraft.com/jsch/ Jsch是java实现的一个SSH客户端.开发JSCH的公司是 jcraft: JCraft成立 ...
- ##* %%* linux变量处理
链接来自他们分享,,,, 如有侵权,请联系本人删除,本人将立即删除.停止分享. https://blog.csdn.net/fengzijinliang/article/details/4252021 ...
- Process用法与进程详解
僵尸与孤儿进程 僵尸进程:父进程的子进程结束的时候父进程没有wait()情况下子进程会变成僵尸进程 孤儿进程(无害) 一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程.孤儿 ...
- DevOps组织中应用架构师的新定位与实践
[摘要] 针对应用架构师相关窘境,在现代化的应用开发中,DevOps组织需要定义应用架构师职责,使应用架构师与DevOps团队各角色更有效的沟通,交付更有价值的产品.在多数情况下,应用架构师不是Dev ...
- 华为路由交换-DHCP
DHCP 一. 配置基于接口地址池的DHCP 1.1实验原理 随着网络规模的扩大和网络复杂程度的提高,计算机位置变化(如便携机或无线网络)和计算机数量超过可分配的IP地址的情况将会经常出现.DHCP( ...
- 【java基础】Thread类之join方法
- 数据库Oracle函数之单行函数的介绍
函数介绍: 函数:是数据库产品中提供的能够处理查询结果的方法. 函数能够用于下面的目的: • 执行数据计算 • 修改单个数据项 • 格式化显示的日期和数字 • 转换列数据类型 • 函数有输入参数,并且 ...
- Mysql基础03-函数
函数 字符串函数 函数 用法 CONCAT(S1,S2,......,Sn) 连接S1,S2,......,Sn为一个字符串 CONCAT_WS(s, S1,S2,......,Sn) 同CONCAT ...
- Python爬虫实现抓取腾讯视频所有电影【实战必学】
2019-06-27 23:51:51 阅读数 407 收藏 更多 分类专栏: python爬虫 前言本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问 ...