V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
fdsfsdfsdf3334
V2EX  ›  问与答

大家好,我学着写了一个 socket 通信的方法,不知道是不是叫协议,请大家给出建议

  •  
  •   fdsfsdfsdf3334 · 2014-07-08 03:48:00 +08:00 · 2716 次点击
    这是一个创建于 3798 天前的主题,其中的信息可能已经有所发展或是发生改变。
    在下最近需要写一个c/s软件,以前没有接触过socket,于是就选择了ZeroMQ ,ZeroMQ 不仅是消息列表,还封装了socket,用起来很方便,但是这个东西,我只会收消息和发消息,不知道如何来处理身份验证, 不知道如何让用户登陆,并保持登陆状态,于是我花了一点时间,写了下面的代码。不知道这个能否用在实际应用中,请大家帮忙看看,并给出一些建议

    如果你觉得这个代码有哪些地方不合理,请告诉我

    --------------------------------------------------------------------------
    由于我用的是python,所以,选的是pyzmq 也就是ZeroMQ 的python版本

    我先讲下,其中用到的协议:

    客户端给服务器发送 connect:give me timestap 可以看到前7个字符串是connect,表示,告诉服务器,我要连接你了,请你发个timestap给我, [timestap用来防止重放攻击]


    当服务器收到 客户端的 connect:give me timestap,就生成一个timestap并进行sha256加密,然后发送给客服端 timeStr:877c942ca4ae7238ad8a67ff0b0da1067d3b05f914d26cccfea273964e405111

    客户端收消息里有timeStr,就提取出后面的64个timestap字符串,然后把本地的的用户名,密码,和服务器发给客户端的timestap字符串 用冒号 拼接后 一起发送给服务器
    givepwd:8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918:a665a45920422f9d417e4867efdc4fb8a04a1f3fff1fa07e998e86f7f7a27ae3:877c942ca4ae7238ad8a67ff0b0da1067d3b05f914d26cccfea273964e405111

    服务器收到givepwd,就对这个消息进行解析,首先判断timestap是否正确,错误就直接断开这个客户端

    然后服务器拿数据库里的usernameSalt [username的盐] + 客服端提交的 [用户名sha256加密值] ,得出了一个新的字符串,对这个新的字符串,再次进行sha256加密,然后拿这个和数据库里的usernameSha对比,正确表示用户名对的,错误就断开

    密码也是用上面的验证方法

    当验证通过,就随时生成一个session并存入数据库 ,然后发给客户端,这里,个人觉得session要入库,因为,如果服务器突然卡死,挂掉,如果重启,那么内存里的数据就会丢失,但恰巧这个时候,某个客户端要提交数据,结果由于服务器里没有session,那数据就会提交失败,影响用户体验;不过转念又想,或许直接存服务器内存里,就算服务器挂了,重启,客户端提交数据,也可以在客户端引导用户重新登陆,但这始终还是没有存数据库好,不知道大家觉得哪个更好

    用户每次重新登陆一下,session就会重新生成一下



    代码在 http://paste.ubuntu.com/7761757/
    fdsfsdfsdf3334
        1
    fdsfsdfsdf3334  
    OP
       2014-07-08 03:48:11 +08:00
    代码在 http://paste.ubuntu.com/7761757/

    谢谢大家哦
    allenforrest
        2
    allenforrest  
       2014-07-08 09:19:16 +08:00
    zeromq 只是解决可靠通信的问题,只是管道。
    你所需要的用户登录鉴权、session 管理都是上层该做的事情,应该单独定义一套 client-server 间接口协议,与 zeromq 无关。
    你现在的实现我觉得没啥大问题,只是目前使用「connect:give me timestamp」这样文本字符串作为接口消息稍微有点怪,可以考虑改用 JSON,接口定义会整洁漂亮很多、代码实现上也会有诸多方便。
    fdsfsdfsdf3334
        3
    fdsfsdfsdf3334  
    OP
       2014-07-08 10:05:44 +08:00
    @allenforrest 谢谢您的建议
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2767 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 09:56 · PVG 17:56 · LAX 01:56 · JFK 04:56
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.