第二阶段报告¶
服务端ServerWindow¶
简单的初步操作¶
- 新建
NetworkServer类指针server,并connect网络接口中的NetworkServer::receive与自己的ServerWindow::receive,使得来自客户端的数据能够用传进receive函数中。 - 设置一个
LineEdit用来输入端口号,赋值给port。 - 开启客户端监听
server->listen(QHostAddress::Any,port)。 - 在头文件中设置6个
QTcpSocket类指针_socket[6],用来存储在房间内的客户端指针。(这里做了简化,只考虑了一个房间。) - 继承自第一阶段的棋盘界面
MainWindow用来现实当前对局状况。
ServerWindow::receive函数¶
- 传进来的信息参量是
QTcpSocket类指针,设为*s;Networkdata类,设为w。s为方便服务端识别是哪个客户端发来的信息。 - 通过
if、else语句对w.op进行分类讨论,收到客户端的信息后进行相应的操作,必要时给客户发送信息this->server->send(_socket,data); - 收到客户端的
MOVE_OP请求后,调用判棋函数,判棋函数与第一阶段的类似。 - 每次行棋结束后,检索棋盘,判断是否有玩家胜利,并发送胜利信息。
客户端ClientWindow¶
简单的初步操作¶
-
新建
NetworkSocket类指针socket,并connect网络接口中的NetworkSocket::receive与自己的ClientWindow::receive,使得来自服务端的数据能够用传进receive函数中。 -
分别做如下两个connect,用来显示连接成功与否,并引导用户进行下一步操作。
connect(socket->base(), &QAbstractSocket::errorOccurred, this, &ClientWindow::displayError);
connect(socket->base(), &QAbstractSocket::connected, this, &ClientWindow::connected);
connected:show一个可视化窗口,显示“连接成功”,并附带按钮“OK”。当用户点击OK后,进入房间界面RoomWindow。
displayError:show一个可视化窗口,显示“连接失败”,并附带按钮“OK”。当用户点击OK后,重新进入输入IP和端口号界面,即ClientWindow。
-
设置两个
LineEdit用来输入IP和端口号,分别赋值给host和port。 -
尝试连接服务端
this->socket->hello(host, port),接下来分别对应2中的两种情况。
ClientWindow::receive函数¶
- 传进来的信息是个
Networkdata类,设为w。 - 通过
if、else语句对w.op进行分类讨论,收到服务端的信息后进行相应的操作,必要时给服务端发送信息this->socket->send(data)
RoomWindow界面¶
- 六行两列的
QLabel,分别现实六个玩家名和六个准备状态。 - 三个按钮,加入房间、退出房间、准备。
- 当收到服务端的进出房间请求后,更新房间显示。
- 当收到
START_GAME_OP,关闭RoomWindow,打开ClientWindow。
其他操作¶
- 与标准坐标的坐标转化。
- 对第一阶段成果进行修改,如点击函数、轮转时机等。