在(聊天)服务器和客户端之间进行通信

时间:2011-02-14 07:14:54

标签: network-programming

只是为了澄清某些问题。

假设我正在制作聊天应用程序。大多数在线教程都是基本的服务器 - 客户端程序,它们将聊天消息直接作为字符串发送。

那么如果有人上线或离线怎么办?客户端如何通知服务器此类更改?我想出的是使用标记{online} User,{offline} user,{privatechat} blabla。

如果有人知道您的代码如何以及允许他们通过发送{online} blabla进行破坏,该怎么办? 这可行,但也有一些我能想到的缺陷。这样做的正确或更好的方法是什么?

有人能指出我正确的方向吗?感谢。

或者另一个例子,在游戏中。要告诉设备向右移动,它是否会将字符串发送回服务器{unit} {move right}?这些方面的东西。


我有点了解如何制作聊天服务器的逻辑。如果我只是在文本框中添加“{chat}”前缀。只要我读到这个命令“{chat}”,我就会忽略出现的任何命令。

在一个RTS中(不是说我要制作一个,只是好奇),你的意思是有50个字符串告诉单位如何移动,攻击,攻击,行动等?所有这些命令都将在一个线程上完成吗?还是多线程的?

1 个答案:

答案 0 :(得分:0)

嗯,你必须实现会话处理并发送sessionToken与您的订单在游戏中移动一个单位。因此服务器将能够检查指向用户是否有权订购指向的单位等。聊天相同的事情。

在我的聊天中,每个客户端每两分钟向服务器发送一些PING消息。因此,如果5分钟过去且未收到PING,则服务器将用户计为[离线]。

如果你害怕欺骗那些对你的客户进行逆向工程的用户,并且会因为欺骗而给系统带来严重的麻烦,你必须做两件事:

  1. 让服务器检查是否给定 用户订单有效
  2. 实施bot检测。检查是否 用户对某些操作做了一些操作 恒定时间间隔或用户 使用了一些有限的单词 聊天等。
  3. 我希望这篇文章至少能给你一些帮助。

    服务器逻辑的示例如下:

    [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#。只是为了证明逻辑。