这次写的是一个网络版五子棋

怎么说的,这次的cpp文件文件比较多,我就贴个github代码吧

github
编译主要看 makefile里那几个文件
实现了 登录 匹配下棋。

服务器用了 epoll+线程池(模仿《linux高性能编程写的》)但这次的教训就是这个棋局的主体业务逻辑应该放在服务器(我写在客户端由客户端判断棋局是否结束),而且线程池处理也是计算密集型任务,在这种俩个用户并非同时下棋的程序中可以不用。更何况放在客户端的业务逻辑可以伪造的,这样服务器就可能收到伪造的数据。

给大家看下效果:

经验:

  1. 由于用的是PACK的buffer缓存给线程池的process函数执行(同样还有写缓冲), 每次EPOLLIN 读入后需要切换 EPOLLOUT,写出后再切换EPOLLIN,这样就不会多次读入到同一缓冲区了。
  2. c++线程中想要使用类的函数,得需要 thread(clientUser::UI, this).detach();在参数中传入对象的指针,同时这个调用的函数必须得是类内的静态函数,且这个静态函数也只能调用类的静态成员,想要使用对象只能使用传进来的arg 通过clientUser *cu = (clientUser *) arg;再使用cu->xxx来使用cu内的成员
    3.输入出错重新输入的c++方式
while (1) {cin >> ch;if (cin.fail()) {std::cout << "输入有误" << std::endl;cin.clear();cin.ignore();continue;}break;}

4.condition_variable中要传锁得是unique_lock ,而不是mutex。
同时从源码可知调用条件变量的wait中可以传入的条件是while(!p)而不是if,也就是条件不满足会重新wait休眠。

template<typename _Predicate>voidwait(unique_lock<mutex>& __lock, _Predicate __p){while (!__p())wait(__lock);}

5.类的静态成员的初始化在类外不能在.h,放其中一个.cpp即可(最好放在类的.cpp内)
6.网络发包的pack中不能出现容器,本来很想用string!
7.make_shared_ptr 的参数是对象而不是对象指针,如果在类中有shared_ptr可以通过构造函数传入的new指针初始化,
8.ET模式下 read是一次读完后出现EAGAIN ,EWOULDBLOCK说明客户发的全部读了(是对的),而我使用包装成Readn恰好读PACK的大小可能不会执行到这一步。
9.匹配可以使用对象指针队列,匹配成功放在一个pair集合,比赛结束或者用户退出则需要在队列和集合等容器中清除对象指针

  1. str = "SELECT * FROM information_schema.SCHEMATA where SCHEMA_NAME='chess'";判断是有chess这个数据库,str = "select TABLE_NAME from INFORMATION_SCHEMA.TABLES where TABLE_SCHEMA='chess' and TABLE_NAME='account'";判断chess库是否有account表。
  2. 刚看了点设计模式,觉得这个是客户端的客户类是需要设置为单例模式的。并且这次的程序代码复用性不强,本想同时给五子棋类设计的判断胜出规则放在了Table类,而五子棋类的父类ChessBase就显的很累赘rule()没用上,之后再想方法完善,可能是因为不知道围棋的规则,没法实践c++继承体系。

c++网络五子棋Linux版相关推荐

  1. 单机版五子棋java功能_java实现单机版和网络对战版五子棋程序

    [实例简介] java实现单机版和网络对战版五子棋,功能包括计时.悔棋.聊天.显示双方状态等等.详细见https://blog.csdn.net/qq_37913997/article/details ...

  2. 在Ubuntu20.04中继续使用linux版“网络调试助手”的方法

    在Ubuntu20.04中继续使用linux版"网络调试助手"的方法 网络调试助手是一款很好用的网络通信调试软件,对于初学网络编程的人员简单实用.windows版的调试助手在各个版 ...

  3. java实现单机版和网络对战版五子棋

    java实现单机版和网络对战版五子棋,功能包括计时.悔棋.聊天.显示双方状态等等. 选择com.fivechess.view中的SelectMenu.java开始游戏,效果如图: (1)单机版 点击& ...

  4. linux 网络音乐,网易云音乐上线在线音乐应用中首个Linux版

    原标题:网易云音乐上线在线音乐应用中首个Linux版 [天极网IT新闻频道]最近,国内Linux用户乐开了花,因为他们终于可以在Linux系统内听在线音乐了. 5月25日,网易云音乐Linux版正式上 ...

  5. 无人值守网络安装Linux

    Linux操作系统的安装方法相信很多人已经非常熟悉了,一般多以从网络中下载iso文件并刻录一张DVD光盘后从光驱安装比较常见,但是,当您有大批相同配置的电脑需要安装Linux,或者您的电脑没有光驱,那 ...

  6. 华为荣耀电脑第三方linux,【第三方Linux版】荣耀MagicBook Pro 16.1英寸全面屏如何?某东入手评测...

    这款[第三方Linux版]荣耀MagicBook Pro 16.1英寸全面屏轻薄笔记本电脑(酷睿i5 8G 512G MX250 IPS)冰河银,看网上评测推荐的,后面网上种草了这款笔记本,用过一段日 ...

  7. linux免费计费系统下载,思谷电话计费系统 Linux版

    思谷电话计费系统2009 Linux版功能简介: 1.支持数百种型号交换机,多种计费方式 系统提供强大灵活的话单格式编辑器,配合多种特殊指令,可以准确解析大多数交换机的话单.对于新机型,用户只要按照原 ...

  8. 音乐无界限,听见好时光—网易云音乐Linux版震撼来袭!

    为了带来更好的音乐体验,实现对音乐高品质的追求,经过网易云音乐与深度科技团队长达半年多的联合开发,大家期待已久的网易云音乐正式登陆 Linux 平台! 网易云音乐是一款专注于发现与分享的音乐产品,依托 ...

  9. 那个linux系统自带应用商店,如何在荣耀笔记本(Linux版)中拥有deepin应用商店?...

    IT之家10月9日消息 刚刚,深度操作系统官方发文详解,如何在荣耀笔记本(Linux版)中拥有深度应用商店,我们来看一下吧. 以下为如何在荣耀笔记本(Linux版)中拥有deepin应用商店官方教程全 ...

最新文章

  1. 网络拓扑系列 - 网络拓扑的“管理”元素
  2. vue.js学习笔记(1)
  3. Py之folium:python库之folium的简介、安装、使用方法之详细攻略
  4. 【实用】ABAP ALV单元格修改信息提示
  5. mysql mysql的所有查询语句和聚合函数(整理一下,忘记了可以随时看看)
  6. python的setting怎么找_Python的Django框架中settings文件的部署建议
  7. AUTOSAR从入门到精通100讲(十三)--autosar架构中的ARXML
  8. mysql status lock_MySQL性能突发事件问题排查技巧
  9. python中tolist_python 列表,数组,矩阵两两转换tolist()的实例
  10. 更改git提交显示的用户名
  11. js让显示层居中且有遮挡层(IE,火狐,Chrome均可)
  12. centos7+mysql5.7二进制安装
  13. 前端调用3dmax模型转换.gltf格式
  14. 自留-Python:线性拟合(直线+曲线)
  15. 国外兼职网站列举 79个
  16. 基于方格网法的填挖方量计算(C++)
  17. 频繁gc是什么意思_经常听到的期货黄金gc是什么意思?
  18. linux环境中英文切换配置以及乱码问题
  19. 春江花月夜--张若虚为你而颂
  20. 神器Tushare获取指数数据

热门文章

  1. 海思Hi3521DV200移植opencv3.3
  2. 【SPSS】卡方检验详细操作教程(附案例实战)
  3. Java基础知识点7,JDK 和 JRE 、final 与 static 、堆和栈
  4. 此设备上的蓝牙无法使用,请尝试使用外部适配器解决方案
  5. 对于攒机的一些建议及经验之谈
  6. Ni Multisim中规模集成电路设计
  7. 基于自适应反步法的三自由度直升机(3 DOF Helicopter)轨迹跟踪
  8. 《IDA Pro 代码破解解密》笔记一
  9. 需要准备哪些材料才能申报中、高级职称?
  10. 中创公益|中创算力荣获“2022年度突出贡献爱心企业”