Qt图形化与socket通信

序言

  本学期面向对象程序设计实践(C++)的课程设计作业是设计并实现宠物小精灵对战系统。其中程序本体需要采用 C/S 模式,即客户端和服务端用socket进行通信,服务端保存所有用户的信息
  本作业例程源代码Alice Archive将在作业完成后开放权限为public。先在此浅谈一下客户端与服务端使用socket进行通信的基础实现

Socket通信

为了在项目代码当中使用<QTcpSocket>等头文件,我们首先需要在Qt项目文件.pro当中添加如下内容:

1
QT += network

客户端

我们需要进行如下操作以实现使用QT中的QTcpSocket类与服务器进行通信:

1.在类MainWindow当中添加如下成员:

1
2
3
4
5
6
7
private:
QTcpSocket *socket;
QString IP;
int port;

void readData();
void socket_disconnected();

2.在类MainWindow构造函数当中,加入如下信息:
  创建QTcpSocket套接字对象
  指定IP与端口

1
2
3
socket = new QTcpSocket(this);
IP = "127.0.0.1";
port = 10043;

3.当socket接收缓冲区有新数据到来时,会发出readRead()信号,因此为该信号添加槽函数以读取数据。同理设置断开连接执行的函数操作

1
2
QObject::connect(socket, &QTcpSocket::readyRead, this, &MainWindow::readData);
QObject::connect(socket, &QTcpSocket::disconnected, this, &MainWindow::socket_disconnected);

对于接受缓冲区发来的信息执行的读取操作:

1
2
3
4
5
void MainWindow::readData()
{
QByteArray buf = socket->readAll();
//后续操作
}

断开与服务器的连接:

1
2
3
void MainWindow::socket_disconnected(){
socket->close();
}

4.在合适的位置使用该IP与端口设置连接服务器:

1
socket->connectToHost(ip, port);

5.使用write函数向服务器发送数据:

1
2
QByteArray data = /***/;
socket->write(data);

服务器端

除了使用<QTcpSocket>,我们还需要在此使用QTcpSever

1.同理,在构造函数当中创建QTcpSever对象:

1
server = new QTcpServer(this);

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

1
2
int port;
server->listen(QHostAddress::Any, 6677);

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

1
2
3
4
5
6
7
connect(server, &QTcpServer::newConnection, this, &TcpServer::ClientConnect);
void TcpServer::ClientConnect(){
while (server->hasPendingConnections()){
socket = server->nextPendingConnection();
connect(socket, &QTcpSocket::readyRead, this, &TcpServer::ReadData);
}
}

4.使用socket的write函数向客户端发送数据:

1
2
QByteArray data = /***/;
socket->write(data);

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

1
2
3
4
void TcpServer::ReadData(){
QByteArray buf = socket->readAll();
//后续操作
}