网络五子棋
工具组件 commons
双端都需要使用的类 单独开发 以jar形式添加到客户端和服务器端使用
1.右键资源项目 导出 选择 JAR file 导出成.jar文件
2.在要使用该资源的项目中 创建lib文件夹 复制.jar文件
3.右键点击.jar文件 build path—>add to build path 可以访问.jar文件中的类
实体类:
Chess 棋子类
User 用户类
各种消息类:
RegisterMessage 注册请求信息类
RegisterResponseMessage 注册响应回写信息类
LoginMessage 登录请求信息类
LoginResponseMessage 登录响应回写信息类
OnlineListMessage 获取在线列表请求信息类
OnlineListResponseMessage 在线列表响应回写信息类
BattleInviteMessage 对战请求信息类
BattleInviteResponseMessage 对战响应信息类
ChessMessage 落子信息类
PingMessage 心跳检测信息类
ResponseMessage 所有响应信息的父类
Message 所有信息的父类
客户端
Data 记录本身对象 用于判定是否和自己对战
MainApplication 程序入口 展示单机or网络
LocalGameStage 单机版界面及游戏
LoginStage 登录界面
RegisterStage 注册界面
OnlineListStage 展示在线所有玩家姓名的窗口
OnlineGameStage 网络游戏界面
GetOnlineListTask 定时发送在线列表请求的任务 可以使用定时器 内部类形式替换
ClientMessageHandler 发送各种请求 接收并处理各种响应
服务器端
JDBCHelper 数据库连接辅助类
UserDao 设计的操作数据库的接口
UserDaoImpl 接口实现类
Data 保存所有登录成功的客户线程 Map<用户名称,线程对象>
ChessServer 服务器开启类 main()方法类
开启心跳检测 开启PingThread线程
循环监听 一旦监听到客户端请求 马上创建对应的一个ServerMessageHandler线程对象
把这个客户端和服务器沟通使用的Socket存入
开启这个ServerMessageHandler线程
PingThread 心跳检测线程类
ServerMessageHandler 每个客户端和服务器沟通的一个线程 内部有Socket对象属性
心跳检测:
服务器开启后 同时开启心跳检测线程PingThread 该线程循环执行 任务是使用Map集合中所有的线程对象发送PingMessage信息 如果报出异常 则说明对方不在线 将其键值对从Map集合中删除 这个任务中会休眠10s
注册:
客户端点击注册按钮 创建ClientMessageHandler(单例模式)线程的对象 调用send() 将注册信息发送
服务器监听到请求 创建其ServerMessageHandler 线程对象 专门处理当前客户端的请求 利用当前线程中的send方法 发送回写信息
登录:
客户端点击登录按钮 使用之前创建的ClientMessageHandler 线程对象 调用send()将登录信息发送给服务器
服务器监听到 同样创建其ServerMessageHandler 线程对象 处理该客户的请求
如果验证登录成功 则将此线程对象 以键值对的形式保存 键用户名 值线程 回写信息
客户端接收到登陆成功的回写信息后 开启计时器 定时向服务器发送获取在线列表的请求 打开在线列表界面
获取在线列表:
客户端用计时器 每隔5s发送一次请求 服务器接收到后 从Map集合中 获取所有键值对的键的集合 会写给客户端
客户端将其集合给到ListView对象 ListView添加进画板 展示在线列表 ListView添加双击事件 邀请对战
邀请对战:
客户端1双击在线列表中的用户名 判断不是本人 则预备发出对战邀请信息 记录本人姓名和被邀请人姓名
服务器接收到对战邀请信息BattleInviteMessage解析出被邀请人姓名 获取其线程 直接发出原信息对象
客户端2 接收到BattleInviteMessage 确认是否应战 编辑回写信息类BattleInviteResponseMessage
邀请方姓名 被邀请方姓名 是否应战
服务器接收到对战响应信息BattleInviteResponseMessage 解析出其中邀请方姓名 获取其线程 直接发出该信息
客户端1接收到BattleInviteResponseMessage 获取对方是否应战 应战则关闭在线列表 打开在线游戏界面
落子:
客户端1落子后 生成ChessMessage 发送给服务器 服务器解析出客户端2姓名 获取其线程对象 转发ChessMessage给客户端2
客户端2 接收到ChessMessage后 解析棋子信息 画在客户端2的棋盘上
如果客户端1落子获胜 依然生成ChessMessage给所有属性赋值(获胜方姓名 是否获胜等) 客户端2以此判断并展示