最近写大作业用到 Qt 的 Socket 部分, 网上关于这部分的资料都太过复杂, 现在总结一下一些简单的应用有机会可以给大家讲讲用 Socket 传送文件的代码
这里主要讲解如何实现 TCP 和 UDP 的简单通信
socket 简介
在 LINUX 下进行网络编程, 我们可以使用 LINUX 提供的统一的套接字接口但是这种方法牵涉到太多的结构体, 比如 IP 地址, 端口转换等, 不熟练的人往往容易犯这样那样的错误 QT 中提供的 SOCKET 完全使用了类的封装机制, 使用户不需要接触底层的各种结构体操作而且它采用 QT 本身的 signal-slot 机制, 使编写的程序更容易理解
这是文档个人觉得, QT 的文档除了缺少一些例子, 其他还是不错的
QT5 中相比于 QT4 应该更新了一些 socket 的应用, QT4 相比于 QT3 也更新了不少, 而且还改了很多的类名, 大家在网上找资料的时候一定要注意
UDP 通信
UDP 没有特定的 server 端和 client 端, 简单来说就是向特定的 ip 发送报文, 因此我把它分为发送端和接收端
注意: 在. pro 文件中要添加 QT += network, 否则无法使用 Qt 的网络功能
发送端
#include <QtNetwork> QUdpSocket * sender;
sender = new QUdpSocket(this);
QByteArray datagram = hello world ! ;
//UDP 广播
sender - >writeDatagram(datagram.data(), datagram.size(), QHostAddress: :Broadcast, 6665);
// 向特定 IP 发送
QHostAddress serverAddress = QHostAddress("10.21.11.66");
sender - >writeDatagram(datagram.data(), datagram.size(), serverAddress, 6665);
/* writeDatagram 函数原型, 发送成功返回字节数, 否则 - 1
qint64 writeDatagram(const char *data,qint64 size,const QHostAddress &address,quint16 port)
qint64 writeDatagram(const QByteArray &datagram,const QHostAddress &host,quint16 port)
*/
UDP 接收端
#include <QtNetwork>
QUdpSocket *receiver;
// 信号槽
private slots:
void readPendingDatagrams();
receiver = new QUdpSocket(this);
receiver->bind(QHostAddress::LocalHost, 6665);
connect(receiver, SIGNAL(readyRead()),this, SLOT(readPendingDatagrams()));
void readPendingDatagrams()
{
while (receiver->hasPendingDatagrams()) {
QByteArray datagram;
datagram.resize(receiver->pendingDatagramSize());
receiver->readDatagram(datagram.data(), datagram.size());
// 数据接收在 datagram 里
/* readDatagram 函数原型
qint64 readDatagram(char *data,qint64 maxSize,QHostAddress *address=0,quint16 *port=0)
*/
}
}
TCP 通信
TCP 的话要复杂点, 必须先建立连接才能传输数据, 分为 server 端和 client 端
TCP client 端
#include <QtNetwork>
QTcpSocket *client;
char *data="hello qt!";
client = new QTcpSocket(this);
client->connectToHost(QHostAddress("10.21.11.66"), 6665);
client->write(data);
TCP server 端
#include <QtNetwork>
QTcpServer *server;
QTcpSocket *clientConnection;
server = new QTcpServer();
server->listen(QHostAddress::Any, 6665);
connect(server, SIGNAL(newConnection()), this, SLOT(acceptConnection()));
void acceptConnection()
{
clientConnection = server->nextPendingConnection();
connect(clientConnection, SIGNAL(readyRead()), this, SLOT(readClient()));
}
void readClient()
{
QString str = clientConnection->readAll();
// 或者
char buf[1024];
clientConnection->read(buf,1024);
}
至于传中文乱码的问题, 其实可以在前面的文章中解决
也可以看看这个
百度搜索就爱阅读, 专业资料, 生活学习, 尽在就爱阅读网 92to.com, 您的在线图书馆!
来源: http://www.92to.com/bangong/2018/01-22/33136256.html