以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.com/bbs/index.asp)
--  专家坐堂  (http://foxtable.com/bbs/list.asp?boardid=2)
----  用新的HttpClient取代以前的OpenQQ获取新编号的方法。因为新用户注册,是用不了OpenQQ  (http://foxtable.com/bbs/dispbbs.asp?boardid=2&id=94410)

--  作者:chen3728060
--  发布时间:2016/12/22 23:49:00
--  用新的HttpClient取代以前的OpenQQ获取新编号的方法。因为新用户注册,是用不了OpenQQ

用狐表的人都知道OpenQQ是解决网络自动编号的终极正解武器,从派号的源头杜绝重复编号,这个我会用。

问题是这个工具,是基于OpenQQ登陆的情况下,与服务器通讯获得的自动编号。

 

       我现在遇到一个有趣的问题,就是我做了一个新用户注册的窗口,里面需要生成一个自动编号作为用户ID,绝对绝对绝对不能重复!

      问题是,既然是新用户注册,就肯定还没有登陆OpenQQ,那就没办法从服务器里获得最新的用户ID编号。

 

这个问题大家是如何解决的?除非你的系统的用户都是你自己新建,而不允许新用户自行注册。按道理,应该做那种允许客户自己注册的朋友都会遇到

 

我目前只想到一个奇怪的解法:就是客户点击打开注册窗口,用户表新建行的时候,用一个临时账户登录OpenQQ,获取到一个最新的用户ID后,然后断开OpenQQ。这个在少并发的情况下,可用。

       但是由于共用同一个临时账号,如果并发多了,刚好同时有3个人在注册,在前一个人的OPEN QQ登录而又还没产生编号时,另外一个人登录了,就会导致前一个人的用户编号ID生不成。目前能想到的解决方法是,行新建后判断用户ID列是否为空,空的话就弹窗“服务器繁忙,请重新申请注册”,不为空就继续弹出注册窗口。

 

大家有更好的解决思路吗?

 

 

[此贴子已经被作者于2017/3/14 17:17:52编辑过]

--  作者:有点蓝
--  发布时间:2016/12/23 8:40:00
--  
用户ID允许断号不,如果允许,就不存在这个问题的了,每次取号+1,不管多少并发,都不会有重复的吧



--  作者:chen3728060
--  发布时间:2016/12/23 9:10:00
--  回复:(有点蓝)用户ID允许断号不,如果允许,就不存...

可以断,随便断,具体是怎么实现?通过_identify?能有具体的思路说一下吗?


--  作者:有点蓝
--  发布时间:2016/12/23 9:27:00
--  
就你上面的用法啊,用临时账户登录OpenQQ,不管有几个人注册,每次取号都会+1的啊


Dim msg As String = e.Message
If
 msg.StartsWith(":f"AndAlso msg.EndsWith("f:"Then
    msg = msg.SubString(2, msg.Length - 4)
    If pdbhs.ContainsKey(msg) Then \'
如果存在这个类别的编号
        pdbhs(msg) = pdbhs(msg) + 1 \'
将该类别最大编号加1
    
Else
        pdbhs.Add(msg,1\'如果是这个列表的首次编号,则编号等于1
    
End If
    e.ReturnValue = pdbhs(msg) 
\'将编号返回给客户端
End If

--  作者:chen3728060
--  发布时间:2017/3/11 13:47:00
--  
现在移动端有了HttpClient,这个问题算是根治了,不需要再使用OpenQQ获取自动编号了。

服务器端的HttpRequest
Select Case

case "GetNewID.htm"

If e.PlainText > "" Then
    Dim msg As String = e.PlainText
    
    \'网络自动编号--------标志:f
    If msg.StartsWith(":f") AndAlso msg.EndsWith("f:") Then
        msg = msg.SubString(2, msg.Length - 4) \'注意截取位数的关系
        If CodeDic.ContainsKey(msg) Then \'如果存在这个类别的编号,msg传回来是一个自己约定的编号,例如  ItemBrandNo
            CodeDic(msg) = CodeDic(msg) + 1 \'将该类别最大编号加1
        Else
            CodeDic.Add(msg,1) \'如果是这个列表的首次编号,则编号等于1
        End If
        e.WriteString(CodeDic(msg)) \'将编号返回给客户端
    End If
    \'网络自动编号---------标志:f
    
End If

end Select

客户端的datarowAdding

\'--------HttpClient网络自动编号----------
Dim hc As New HttpClient( "Http://192.168.1.103/GetNewID.htm")
hc.Timeout = 5 \'设置超时为5秒
hc .Conten t = ":f" & "ItemBigClassID" & "f:"
Dim rt As String = hc.GetData()
Dim id As Long
If rt > "" Then
    If  Long.TryParse(rt,id)  Then
        e.DataRow("ProjectID") = PublicProjectID
        e.DataRow("ItemBigClassID") = "IBC" & Format(id,"000000000000000000")
    Else
        messagebox.show(PublicMsg_ServerError & rt)
    End If
Else
    messagebox.show(PublicMsg_ServerTimeOut)
    
End If
\'-------HttpClient网络自动编号----------


总结来说,用HttpClient和OpenQQ的原理都是一样的。不过OpenQQ限制了必须先登录才能使用,HttpClient就是自由开放无需登录的。对于新用户注册,这种既需要新编号但是又没办法登录的情况,HttpClient很好解决了这个问题。官方文档里说的这些话确实没错


图片点击可在新窗口打开查看此主题相关图片如下:1.png
图片点击可在新窗口打开查看





[此贴子已经被作者于2017/3/11 13:49:43编辑过]

--  作者:流水
--  发布时间:2023/2/8 21:43:00
--  
学习,还没仔细看高级指南,想做一个独占编辑,却不知道怎么入手,看了杰哥的示例,大概明白了,就是不知道怎么判断心跳信号,用定时器吗?