一:TCP通信介绍
.TCP是面向连接的可靠传输的协议,协议规定交换的双方必须是服务端和客户端的两个角色:
---   服务端负责监听网络端口,等待客户端的连接,用连接的socket完成信息的交互;
---   客户端负责每次连接的发起,建立连接后才可以进行通信;
.TCP的连接是基于流的,数据按照正确的顺序存储在接收缓冲区中,它保证数据能正确的进行交换,但不能保证数据以发送端的数据帧的形式提交。

二:界面设计

客户端

服务端

三:客户端编码
     客户端编码步骤如下:
(1)创建QTcpSocket套接字对象

socket = new QTcpSocket();

(2)使用这个对象连接服务器

//连接服务器
socket->connectToHost(IP,port);

(3)使用write函数向服务器发送数据

//获取文本框的数据并以ASCII码发送出去
void MainWindow::on_pushButton_Send_clicked()
{
    socket->write(ui->textEdit_Send->toPlainText().toLatin1());
    socket->flush();
}

(4)当socket接收缓冲区有新数据到来时,会发出readyRead()信号,因此为该信号添加槽函数以读取数据。

//构造函数中连接
QObject::connect(socket,&QTcpSocket::readyRead,this,&MainWindow::socket_Read_Data);
 
void MainWindow::socket_Read_Data()
{
    QByteArray buffer;
    //读取数据缓冲区数据
    buffer = socket->readAll();
 
}

(5)断开与服务器的连接

//断开连接
socket->disconnectFromHost();

四:服务端编码
     服务端编码步骤如下:
(1)创建QTcpServer对象

server = new QTcpServer();

(2)侦听一个端口,使得客户端可以使用这个端口访问服务器

//监听指定的端口
if(!server->listen(QHostAddress::Any,port)){
   qDebug()<<server->errorString();
}

(3)当服务器被访问时,会发出newConnection()信号,所以为该信号添加槽函数,并用一个QTcpSocket对象接受客户端的访问

//构造函数中连接
connect(server,&QTcpServer::newConnection,this,&MainWindow::server_New_Connection);
void MainWindow::server_New_Connection()
{
    //获取客户端的连接
    socket = server->nextPendingConnection();
}

(4)使用socket的write函数向客户端发送数据

//客户端有新连接是发送信号
QObject::connect(socket,&QTcpSocket::readyRead,this,&MainWindow::socket_Read_Data);
void MainWindow::socket_Read_Data()
{
    QByteArray buffer;
    //读取数据缓冲中的数据
    buffer = socket->readAll();
}

(5)当socket接受缓冲区有新数据到来时,会发出readyRead()信号,为该信号添加槽函数

//获取文本框数据并且以ASCII码的形式发送
void MainWindow::on_pushButton_Send_clicked()
{
    socket->write(ui->textEdit_Send->toPlainText().toLatin1());
    socket->flush();
}

(6)取消侦听

server->close();

五:修改*.pro文件

在文件中添加网络应用的代码库network

QT       += core gui network

六:中文乱码处理

上述发送接收的代码都是单字节数据,对于发送中文数据,在发送和接收是需要做如下处理:

发送数据:

void MainWindow::on_pushButton_Send_clicked()
{
    qDebug()<<"Send: "<<ui->textEdit_Send->toPlainText();
    //兼容中文数据发送
    socket->write(ui->textEdit_Send->toPlainText().toLocal8Bit());
    socket->flush();
    //获取文本框数据并且以ASCII码的形式发送
    //socket->write(ui->textEdit_Send->toPlainText().toLatin1());
    //socket->flush();
}
socket->write(ui->textEdit_Send->toPlainText().toLocal8Bit());
    socket->flush();
    //获取文本框数据并且以ASCII码的形式发送
    //socket->write(ui->textEdit_Send->toPlainText().toLatin1());
    //socket->flush();
}
接收数据:

void MainWindow::socket_Read_Data()
{
    QByteArray buffer;
    //读取数据缓冲区数据
    buffer = socket->readAll();
    if(!buffer.isEmpty()){
        QString str = ui->textEdit_Recv->toPlainText();
        QString strRecv = QString::fromLocal8Bit(buffer);
        str+=strRecv+"\n";
        //刷新显示
        ui->textEdit_Recv->setText(str);
    }
}
QString strRecv = QString::fromLocal8Bit(buffer);
        str+=strRecv+"\n";
        //刷新显示
        ui->textEdit_Recv->setText(str);
    }
}

七:细节注意

(1)Qt5 抛弃了QTextCodec::setCodecForTr()和QTextCodec::setCodecForCString()这两个函数。

直接将 QTextCodec::setCodecForLocale(QTextCodec::codecForName(“UTF8”)) 至于QApplication实例之前即可解决;

(2)本示例中,newConnection信号是对于单线程适用的,nextPendingConnection()只能用于当前线程中,当服务端面向多连接服务时,需要重载incomingConnection()方法,用socket描述符socketDescriptor定义连接socket

原文:https://blog.csdn.net/u013776188/article/details/76890094

客户端与服务端的TCP通信实现(Qt)相关推荐

  1. mysql服务器是否支持tcp/ip连接,(3)MySQL客户端与服务端的TCP/IP及socket连接方式-Go语言中文社区...

    MySQL客户端与服务端的TCP/IP及socket连接方式 客户端与服务器模型 客户端与服务端模型 TCP/IP方式连接 解释说明 TCP/IP套接字方式是MySQL在任何平台下都提供的连接方式,也 ...

  2. 超详细,简单用socket建立客户端与服务端之间的通信

    socket,一种通用的网络编程接口,它是一个特殊的文件描述符. 有三种类型: 接流式套接字(SOCK_STREAM):提供了一个面向连接.可靠的数据传输服务,数据无差错.无重复的发送且按发送顺序接收 ...

  3. php winform通信,C# Winform 通过Socket实现客户端和服务端TCP通信

    操作界面如下: 1.声明Socket 第一个参数:寻址方式,第二个参数:传输数据的方式,第三个参数:通信协议 Socket socket = new Socket(AddressFamily.Inte ...

  4. 黑帽子Python——基础的网络编程工具——TCP的客户端和服务端

    学习自Python黑帽子(第二版) TCP的客户端和服务端 前言 TCP客户端 TCP服务端 问题 后记 前言 直接通过实践学习编程,很容易产生一些细节方面的知识错误,遇到不会的俺就问ChatGPT

  5. springboot实现SSE服务端主动向客户端推送数据,java服务端向客户端推送数据,kotlin模拟客户端向服务端推送数据

    SSE服务端推送 服务器向浏览器推送信息,除了 WebSocket,还有一种方法:Server-Sent Events(以下简称 SSE).本文介绍它的用法. 在很多业务场景中,会涉及到服务端向客户端 ...

  6. AIDL 客户端与服务端的双向通信

    时隔一年半了,终于写下了这个续篇,我发现我的很多博客有头无尾,都是有前面一点点,后面就没写去了,也正在想办法都补上 初涉IPC,了解AIDL的工作原理及使用方法 今天聊聊的是客户端和服务端的相互通信, ...

  7. Python网络编程——客户端与服务端简单信息发送与接受

    python网络编程-服务端与客户端简单信息发送与接受 思考一下我们进行网络中信息通信都需要什么或者说需要具备什么条件才能进行网络通信? 首先我们需要知道给谁发送,也就是目标机是谁,然后我们需要知道对 ...

  8. 【学习笔记】在windows下进行基于TCP的本地客户端和服务端socket通信

    文章目录 socket介绍 java中使用socket 基于tcp的socket通信 使用ServerSocket类创建一个web服务器:(java) windows下的基于tcp的socket编程( ...

  9. 基于多线程的TCP局域网通信,客户端向服务端上传 文件简单实现源码

    客户端 import java.io.*; import java.net.Socket;/*** ### 作业3:* 完成文件上传案例学习* - 案例需求* 客户端:数据来自于本地文件,接收服务器反 ...

最新文章

  1. 使用PLSQL导入导出数据库
  2. Struts 2(一):初识Struts
  3. Python 基础语法(一)
  4. 阿里云云原生网关,开启下一代网关新进程
  5. 修改SAP系统字段描述的方法
  6. 玩转webpack(一)下篇:webpack的基本架构和构建流程
  7. 解析Vue.js中的computed工作原理
  8. java http get json_java实现Http post(参数json格式)、get 请求
  9. java子类和父类有相同成员_Java -- 父类和子类拥有同名的成员变量的情况
  10. 基于弹性计算的AI推理
  11. kdj指标主要看哪个值_KDJ绝密买卖法则
  12. jdk的Selector(3)select的过程
  13. 基于PHP的SQL注入防御
  14. visio流程图的叉号_笔记软件、思维导图软件和流程图软件, mybase, mindmanager, mindmapper,visio...
  15. spark GBT算法
  16. CL210集成身份管理--管理身份服务令牌
  17. 对数据库视图view的理解
  18. 用于指定服务器软件产品的名称,[单选] 下列说明乙肝患者病情已恢复的是()...
  19. Maven_生成项目站点报告
  20. Android高工:细说 Android 多线程,探究原理知其所以然

热门文章

  1. oracle插入数据语句实例,oracle Insert 用法总结
  2. filter执行先后问题_filter的执行顺序是怎样的?
  3. sql时间格式转换yyyymm_XML和实体类之间的转换
  4. python 解码gbk_Python3的url编码和解码,自定义gbk、utf-8的例子
  5. 西安理工大学 计算机考研不分专硕学硕吗,2021年西安理工大学计算机科学与工程学院考研专业目录_研究生考试范围 - 学途吧...
  6. android studio 自动生成对象,在Android Studio中快速导入可绘制对象的方法?
  7. traybox错误怎么办_toolbox提示错误无法使用怎么办?
  8. 各种Arduino外设的用法,生动形象,相当好看!
  9. 不同编程语言能耗不同?看这27种语言对比!
  10. UCF转XDC工具说明文档