<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>r4r4r5t5tvvvv (123)</title>
    <link>https://ruby-china.org/r4r4r5t5tvvvv</link>
    <description></description>
    <language>en-us</language>
    <item>
      <title>已删除</title>
      <description>&lt;p&gt;已删除&lt;/p&gt;</description>
      <author>r4r4r5t5tvvvv</author>
      <pubDate>Sat, 13 Apr 2019 20:05:31 +0800</pubDate>
      <link>https://ruby-china.org/topics/38399</link>
      <guid>https://ruby-china.org/topics/38399</guid>
    </item>
    <item>
      <title>大家好，我学着写了一个 socket 通信的方法，不知道是不是叫协议，请大家给出建议</title>
      <description>&lt;p&gt;在下最近需要写一个 c/s 软件，以前没有接触过 socket，于是就选择了 ZeroMQ，ZeroMQ 不仅是消息列表，还封装了 socket，用起来很方便，但是这个东西，我只会收消息和发消息，不知道如何来处理身份验证，不知道如何让用户登陆，并保持登陆状态，于是我花了一点时间，写了下面的代码。不知道这个能否用在实际应用中，请大家帮忙看看，并给出一些建议&lt;/p&gt;

&lt;p&gt;如果你觉得这个代码有哪些地方不合理，请告诉我&lt;/p&gt;

&lt;hr&gt;

&lt;p&gt;由于我用的是 python，所以，选的是 pyzmq 也就是 ZeroMQ 的 python 版本&lt;/p&gt;

&lt;p&gt;我先讲下，其中用到的协议：&lt;/p&gt;

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

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

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

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

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

&lt;p&gt;密码也是用上面的验证方法&lt;/p&gt;

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

&lt;p&gt;用户每次重新登陆一下，session 就会重新生成一下&lt;/p&gt;

&lt;p&gt;代码在 &lt;a href="http://paste.ubuntu.com/7761757/" rel="nofollow" target="_blank"&gt;http://paste.ubuntu.com/7761757/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;。谢谢&lt;/p&gt;

&lt;p&gt;。&lt;/p&gt;</description>
      <author>r4r4r5t5tvvvv</author>
      <pubDate>Tue, 08 Jul 2014 10:06:40 +0800</pubDate>
      <link>https://ruby-china.org/topics/20371</link>
      <guid>https://ruby-china.org/topics/20371</guid>
    </item>
  </channel>
</rss>
