只是为了澄清某些问题。
假设我正在制作聊天应用程序。大多数在线教程都是基本的服务器 - 客户端程序,它们将聊天消息直接作为字符串发送。
那么如果有人上线或离线怎么办?客户端如何通知服务器此类更改?我想出的是使用标记{online} User,{offline} user,{privatechat} blabla。
如果有人知道您的代码如何以及允许他们通过发送{online} blabla进行破坏,该怎么办? 这可行,但也有一些我能想到的缺陷。这样做的正确或更好的方法是什么?
有人能指出我正确的方向吗?感谢。
或者另一个例子,在游戏中。要告诉设备向右移动,它是否会将字符串发送回服务器{unit} {move right}?这些方面的东西。
我有点了解如何制作聊天服务器的逻辑。如果我只是在文本框中添加“{chat}”前缀。只要我读到这个命令“{chat}”,我就会忽略出现的任何命令。
在一个RTS中(不是说我要制作一个,只是好奇),你的意思是有50个字符串告诉单位如何移动,攻击,攻击,行动等?所有这些命令都将在一个线程上完成吗?还是多线程的?
答案 0 :(得分:0)
嗯,你必须实现会话处理并发送sessionToken与您的订单在游戏中移动一个单位。因此服务器将能够检查指向用户是否有权订购指向的单位等。聊天相同的事情。
在我的聊天中,每个客户端每两分钟向服务器发送一些PING消息。因此,如果5分钟过去且未收到PING,则服务器将用户计为[离线]。
如果你害怕欺骗那些对你的客户进行逆向工程的用户,并且会因为欺骗而给系统带来严重的麻烦,你必须做两件事:
我希望这篇文章至少能给你一些帮助。
服务器逻辑的示例如下:
[WebMethod]
string LoginUser(string login, string pwd)
{
if( dal.IsCorrectUser(login,pwd) )
{
string token = dal.MakeSession(login);
return string;
}
return "-1";
}
[WebMethod]
bool UserOrder(string token, string order)
{
if( !dal.SessionExist(token) )
{
return false;
}
int userId = dal.GetUserBySession(token);
if(! dal.ValidOrderForUser(userId,order) )
{
dal.RegisterWrongOrder(userid,order); // For cheaters-detecting purposes
return false;
}
return dal.ExecuteUserOrder(userId, order);
}
实际上,您可以将字符串或任何可序列化对象作为用户顺序发送。
[Serializable]
struct UserOrder
{
int unitId;
int Order;
}
所有样本均用于c#。只是为了证明逻辑。