Server - Client.cs - 客户端连接器
class Client { private Socket clientSocket; private Server server; private Message msg = new Message(); private MySqlConnection mysqlConn; private Room room; private User user;//保存用户 private Result result;//保存战绩 private ResultDAO resultDAO = new ResultDAO(); public int HP{get;set;} public bool TakeDamage(int damage){} public bool IsDie(){} public MySqlConnection MySQLConn{} public void SetUserData(User user,Result result){} public string GetUserData(){} public Room Room{set { room = value; }get { return room; }} public int GetUserId(){} //新建一个Client客户端 public Client() { }//构造方法 public Client(Socket clientSocket,Server server) {} //开启监听 public void Start() {} //_开启监听:接收数据Callback private void ReceiveCallback(IAsyncResult ar) {} //_获得数据给server private void OnProcessMessage(请求码,动作码,数据){} //_关闭Socket private void Close(){} //发送信息给客户端 public void Send(动作码, 数据){} public bool IsHouseOwner(){} public void UpdateResult(bool isVictory){} private void UpdateResultToDB(bool isVictory){} private void UpdateResultToClient(){} }
class Client { private Socket clientSocket; private Server server; private Message msg = new Message(); private MySqlConnection mysqlConn; private Room room; private User user;//保存用户 private Result result;//保存战绩 private ResultDAO resultDAO = new ResultDAO(); public int HP{get;set;} public bool TakeDamage(int damage){} public bool IsDie(){} public MySqlConnection MySQLConn{} public void SetUserData(User user,Result result){} public string GetUserData(){} public Room Room{set { room = value; }get { return room; }} public int GetUserId(){} //新建一个Client客户端 public Client() { }//构造方法 public Client(Socket clientSocket,Server server) {} //开启监听 public void Start() {} //_开启监听:接收数据Callback private void ReceiveCallback(IAsyncResult ar) {} //_获得数据给server private void OnProcessMessage(RequestCode requestCode,ActionCode actionCode,string data){} //_关闭Socket private void Close(){} //发送信息给客户端 public void Send(ActionCode actionCode, string data){} public bool IsHouseOwner(){} public void UpdateResult(bool isVictory){} private void UpdateResultToDB(bool isVictory){} private void UpdateResultToClient(){} }
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Net.Sockets;using Common;using MySql.Data.MySqlClient;using GameServer.Tool;using GameServer.Model;using GameServer.DAO;namespace GameServer.Servers{ class Client { private Socket clientSocket; private Server server; private Message msg = new Message(); private MySqlConnection mysqlConn; private Room room; private User user;//保存用户 private Result result;//保存战绩 private ResultDAO resultDAO = new ResultDAO(); public int HP { get;set; } public bool TakeDamage(int damage) { HP -= damage; HP = Math.Max(HP, 0); if (HP <= 0) return true; return false; } public bool IsDie() { return HP <= 0; } public MySqlConnection MySQLConn { get { return mysqlConn; } } public void SetUserData(User user,Result result) { this.user = user; this.result = result; } public string GetUserData() { return user.Id+","+ user.Username + "," + result.TotalCount + "," + result.WinCount; } public Room Room { set { room = value; } get { return room; } } public int GetUserId() { return user.Id; } //新建一个Client客户端 public Client() { }//构造方法 public Client(Socket clientSocket,Server server) { this.clientSocket = clientSocket; this.server = server; mysqlConn = ConnHelper.Connect(); } //开启监听 public void Start() { if (clientSocket == null || clientSocket.Connected == false) return; clientSocket.BeginReceive(msg.Data, msg.StartIndex, msg.RemainSize, SocketFlags.None, ReceiveCallback, null);//开启监听 } //_开启监听:接收数据Callback private void ReceiveCallback(IAsyncResult ar) { try { if (clientSocket == null || clientSocket.Connected == false) return; int count = clientSocket.EndReceive(ar); if (count == 0) { Close();//断开连接 } msg.ReadMessage(count,OnProcessMessage);//_获得数据 Start();//开启监听,造成循环监听,处理message消息 } catch (Exception e) { Console.WriteLine(e); Close(); } } //_获得数据给server private void OnProcessMessage(RequestCode requestCode,ActionCode actionCode,string data) { server.HandleRequest(requestCode, actionCode, data, this); } //_关闭Socket private void Close() { ConnHelper.CloseConnection(mysqlConn);//关闭数据库 if (clientSocket != null) clientSocket.Close(); if (room != null) { room.QuitRoom(this); } server.RemoveClient(this);//_移除断开连线的客户端:server调用 } //发送信息给客户端 public void Send(ActionCode actionCode, string data) { try { byte[] bytes = Message.PackData(actionCode, data); clientSocket.Send(bytes); }catch(Exception e) { Console.WriteLine("无法发送消息:" + e); } } public bool IsHouseOwner() { return room.IsHouseOwner(this); } public void UpdateResult(bool isVictory) { UpdateResultToDB(isVictory); UpdateResultToClient(); } private void UpdateResultToDB(bool isVictory) { result.TotalCount++; if (isVictory) { result.WinCount++; } resultDAO.UpdateOrAddResult(mysqlConn, result); } private void UpdateResultToClient() { Send(ActionCode.UpdateResult, string.Format("{0},{1}", result.TotalCount, result.WinCount)); } }}