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));
}
}
}