Qt实现TCP通信(QQ聊天,带源码)

一、客户端
客户端使用Qt中的QTCPSocket类与服务器进行通信可分为5个步骤:
①创建QTcpSocket套接字对象
socket = new QTcpSocket();

②使用这个对象连接服务器
socket->connectToHost(IP, port);

③使用write函数向服务器发送数据
socket.write(data);

④当socket接收缓冲区有新数据到来时,会发出readyRead()信号,因此将信号绑定到socketReadSlot()槽函数以读取数据
QByteArray buffer;
buffer = socket->readAll();

⑤断开与服务器的连接
socket->disconnectFromHost();

二、服务器
服务器用到QTcpSocket类和QTcpServer类,可分为6个步骤:
①创建QTcpServer对象
server= new QTcpServer();

②侦听一个端口,使得客户端可以使用这个端口访问服务器
server->listen(QHostAddress::Any, port)

③当服务器被客户端访问时,会发出newConnection()信号,因此为该信号添加槽函数,并用一个QTcpSocket对象接受客户端访问
socket = server->nextPendingConnection();

④使用socket的write函数向客户端发送数据
socket.write(data);

⑤当socket接收缓冲区有新数据到来时,会发出readRead()信号,因此为该信号添加槽函数以读取数据
QByteArray buffer;
buffer = socket->readAll();

⑥取消侦听
server->close();

三、简陋界面风格、代码、功能
功能:局域网内实现服务器与客户端通信,如需实现客户端之间的通信,可使用服务器作为消息转发,请自行实现,另外本文只实现基本的文字聊天等功能,图片以及文件的发送,时间原因暂未实现,已预留接口,有兴趣的可以实现相应功能。

下面是效果图
在这里插入图片描述
在这里插入图片描述
从界面上基本可以看到相应的功能,可以使用右键菜单或图标点击的方式。
右键功能可以自定义添加,图标含义说明一下,从左至右依次是:
字体选择设置、字体颜色设置、加粗、斜体、选择图片、选择文件、窗口抖动、窗口截屏。

本文仅供学习使用,所以各方面都比较粗糙,代码部分也仅是基本功能的探索,并未设计架构以及异常处理来保障程序的健壮,另外,在线程方面也只是简单的单线程。

代码:https://github.com/Hhuazai/Qt-TCP

  • 2
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
实现简单的TCP通信聊天工具,可以使用QTQTcpSocket和QTcpServer类。 QTcpSocket类可以用于创建一个TCP客户端,连接到指定的服务器,并发送和接收数据。QTcpServer类可以用于创建一个TCP服务器,监听指定的端口,并接收和处理客户端的连接请求和数据。 以下是一个简单的例子,演示如何使用QTcpSocket和QTcpServer类实现TCP通信聊天工具: 客户端代码: ``` #include <QtNetwork/QTcpSocket> #include <QtCore/QDebug> QTcpSocket* socket; void connectToHost() { socket = new QTcpSocket(); socket->connectToHost("127.0.0.1", 1234); connect(socket, SIGNAL(readyRead()), SLOT(readData())); } void sendMessage(QString message) { if (socket->state() == QTcpSocket::ConnectedState) { socket->write(message.toUtf8()); socket->flush(); } } void readData() { QByteArray data = socket->readAll(); qDebug() << data; } ``` 服务器端代码: ``` #include <QtNetwork/QTcpServer> #include <QtNetwork/QTcpSocket> #include <QtCore/QDebug> QTcpServer* server; QTcpSocket* client; void startServer() { server = new QTcpServer(); server->listen(QHostAddress::Any, 1234); connect(server, SIGNAL(newConnection()), SLOT(newConnection())); } void newConnection() { client = server->nextPendingConnection(); connect(client, SIGNAL(readyRead()), SLOT(readData())); } void sendMessage(QString message) { if (client != nullptr && client->state() == QTcpSocket::ConnectedState) { client->write(message.toUtf8()); client->flush(); } } void readData() { QByteArray data = client->readAll(); qDebug() << data; } ``` 这是一个简单的例子,仅供参考。在实际应用中,还需要考虑更多的因素,如数据的编码、发送和接收的协议、异常处理等。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值