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

2014-07-08 03:48:00 +08:00
 fdsfsdfsdf3334
在下最近需要写一个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/
2624 次点击
所在节点    问与答
3 条回复
fdsfsdfsdf3334
2014-07-08 03:48:11 +08:00
代码在 http://paste.ubuntu.com/7761757/

谢谢大家哦
allenforrest
2014-07-08 09:19:16 +08:00
zeromq 只是解决可靠通信的问题,只是管道。
你所需要的用户登录鉴权、session 管理都是上层该做的事情,应该单独定义一套 client-server 间接口协议,与 zeromq 无关。
你现在的实现我觉得没啥大问题,只是目前使用「connect:give me timestamp」这样文本字符串作为接口消息稍微有点怪,可以考虑改用 JSON,接口定义会整洁漂亮很多、代码实现上也会有诸多方便。
fdsfsdfsdf3334
2014-07-08 10:05:44 +08:00
@allenforrest 谢谢您的建议

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/121456

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX