赞
踩
创建套接字
将套接字设置为监听模式
等待并接受客户端请求
可以通过QTcpServer提供的void newConnection()信号来检测是否有连接请求,如果有可以在对应的槽函数中调用nextPendingConnection函数获取到客户端的Socket信息(返回值为QTcpSocket*类型指针),通过此套接字与客户端之间进行通信。
接收或者向客户端发送数据 接收数据:使用read()或者readAll()函数
发送数据:使用write()函数
客户端通信流程:
1.创建套接字 ;
2.连接服务器 可以使用QTcpSocket类的connectToHost()函数来连接服务器。
3.向服务器发送或者接受数据 ;
通过Qt提供的QTcpServer类实现服务器端的socket通信:
class TCPServer : public QMainWindow { Q_OBJECT public: explicit TCPServer(QWidget *parent = 0); ~TCPServer(); public slots: void slotNewConnection(); void slotReadyRead(); private: Ui::TCPServer *ui; // 负责监听的套接字 QTcpServer* m_server; // 负责通信的套接字 QTcpSocket* m_client; }; //---------- tcpserver.cpp ------------ TCPServer::TCPServer(QWidget *parent) : QMainWindow(parent), ui(new Ui::TCPServer), m_server(NULL), m_client(NULL) { ui->setupUi(this); //创建套接字对象 m_server = new QTcpServer(this); //将套接字设置为监听模式 m_server->listen(QHostAddress::Any, 9999); //通过信号接收客户端请求 connect(m_server, &QTcpServer::newConnection, this, &TCPServer::slotNewConnection); } TCPServer::~TCPServer() { delete ui; } void TCPServer::slotNewConnection() { if(m_client == NULL) { //处理客户端的连接请求 m_client = m_server->nextPendingConnection(); //发送数据 m_client->write("服务器连接成功!!!"); //连接信号, 接收客户端数据 connect(m_client, &QTcpSocket::readyRead, this, &TCPServer::slotReadyRead); } } void TCPServer::slotReadyRead() { //接收数据 QByteArray array = m_client->readAll(); QMessageBox::information(this, "Client Message", array); }
//------------- tcpclient.h ------------ class TCPClient : public QMainWindow { Q_OBJECT public: explicit TCPClient(QWidget *parent = 0); ~TCPClient(); public slots: void slotReadyRead(); void slotSendMsg(); private: Ui::TCPClient *ui; QTcpSocket* m_client; }; //------------- tcpclient.cpp -------------- TCPClient::TCPClient(QWidget *parent) : QMainWindow(parent), ui(new Ui::TCPClient) { ui->setupUi(this); //创建套接字 m_client = new QTcpSocket(this); //连接服务器 m_client->connectToHost(QHostAddress("127.0.0.1"), 9999); //通过信号接收服务器数据 connect(m_client, &QTcpSocket::readyRead, this, &TCPClient::slotReadyRead); //发送按钮 connect(ui->btnSend, &QPushButton::clicked, this, &TCPClient::slotSendMsg); } TCPClient::~TCPClient() { delete ui; } void TCPClient::slotReadyRead() { //接收数据 QByteArray array = m_client->readAll(); QMessageBox::information(this, "Server Message", array); } void TCPClient::slotSendMsg() { QString text = ui->textEdit->toPlainText(); //发送数据 m_client->write(text.toUtf8()); ui->textEdit->clear(); }
qint64 readDatagram(char * data, qint64 maxSize,
QHostAddress * address = 0, quint16 * port = 0)
//data: 接收数据的缓存地址
//maxSize: 缓存接收的最大字节数
//address: 数据发送方的地址(一般使用提供的默认值)
//port: 数据发送方的端口号(一般使用提供的默认值)
使用pendingDatagramSize()可以获取到将要接收的数据的大小,根据该函数返回值来准备对应大小的内存空间存放将要接收的数据。
qint64 writeDatagram(const QByteArray & datagram,
const QHostAddress & host, quint16 port)
//datagram:要发送的字符串
//host:数据接收方的地址
//port:数据接收方的端口号
bool joinMulticastGroup(const QHostAddress & groupAddress);
TCP/IP UDP
是否连接 面向连接 无连接
传输方式 基于流 基于数据报
传输可靠性 可靠 不可靠
传输效率 效率低 效率高
能否广播 不能 能
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。