Qt图形化与socket通信
序言
本学期面向对象程序设计实践(C++)的课程设计作业是设计并实现宠物小精灵对战系统。其中程序本体需要采用 C/S 模式,即客户端和服务端用socket进行通信,服务端保存所有用户的信息
本作业例程源代码Alice Archive将在作业完成后开放权限为public。先在此浅谈一下客户端与服务端使用socket进行通信的基础实现
Socket通信
为了在项目代码当中使用<QTcpSocket>
等头文件,我们首先需要在Qt项目文件.pro
当中添加如下内容:
1 | QT += network |
客户端
我们需要进行如下操作以实现使用QT中的QTcpSocket
类与服务器进行通信:
1.在类MainWindow
当中添加如下成员:
1 | private: |
2.在类MainWindow
构造函数当中,加入如下信息:
创建QTcpSocket套接字对象
指定IP与端口
1 | socket = new QTcpSocket(this); |
3.当socket接收缓冲区有新数据到来时,会发出readRead()
信号,因此为该信号添加槽函数以读取数据。同理设置断开连接执行的函数操作
1 | QObject::connect(socket, &QTcpSocket::readyRead, this, &MainWindow::readData); |
对于接受缓冲区发来的信息执行的读取操作:
1 | void MainWindow::readData() |
断开与服务器的连接:
1 | void MainWindow::socket_disconnected(){ |
4.在合适的位置使用该IP与端口设置连接服务器:
1 | socket->connectToHost(ip, port); |
5.使用write
函数向服务器发送数据:
1 | QByteArray data = /***/; |
服务器端
除了使用<QTcpSocket>
,我们还需要在此使用QTcpSever
1.同理,在构造函数当中创建QTcpSever对象:
1 | server = new QTcpServer(this); |
2.侦听一个端口,使得客户端可以使用这个端口访问服务器:
1 | int port; |
3.当服务器被客户端访问时,会发出newConnection()
信号,因此为该信号添加槽函数,并用一个QTcpSocket对象接受客户端访问:
1 | connect(server, &QTcpServer::newConnection, this, &TcpServer::ClientConnect); |
4.使用socket的write
函数向客户端发送数据:
1 | QByteArray data = /***/; |
5.当socket接收缓冲区有新数据到来时,会发出readRead()
信号,因此为该信号添加槽函数以读取数据:
1 | void TcpServer::ReadData(){ |