以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.com/bbs/index.asp)
--  专家坐堂  (http://foxtable.com/bbs/list.asp?boardid=2)
----  UDPClient端口问题  (http://foxtable.com/bbs/dispbbs.asp?boardid=2&id=152986)

--  作者:andy-1024
--  发布时间:2020/7/28 5:38:00
--  UDPClient端口问题
老师好,我现在想实现下面功能,但是关于端口方面不是很明白。
我现在有两个店面,每个店面都有一台服务器和好几台终端,还有一台远程服务器在阿里云上。
店面做的一些单据需要审核,我现在的软件是把审核过程放在本地机器上进行,缺点是耗时比较长。
所以我现在想全部改为在远程服务器上审核,速度会快很多。这样的话就要用到UDPClient。
店面里任一台机器审核单据的时候发送一个消息到远程服务器,然后远程服务器开始审核,审核完发送回本地操作机器一个反馈消息。
这种情况下本地机器的UDPClient的IP可不可以设置成0.0.0.0?Port应该怎么设置?取多少为好?
远程ReceivedMessage事件中对方的IP和Port又怎么能知道?
从来没有用过这个功能,看教程也是没怎么看懂,请老师指点一下。
谢谢。


--  作者:有点蓝
--  发布时间:2020/7/28 8:57:00
--  
客户端(本地机器)和服务端UDPClient的IP都可以设置成0.0.0.0。Port打开值位于1024~65535之间,不能和其它已使用的端口冲突即可,取什么值自己喜欢即可。

ReceivedMessage

UDPClient收到信息后触发。

e参数属性:

Bytes:      字节数组,以字节数组形式返回收到的信息。
Message:    字符型,以字符形式返回收到的信息,编码格式由EncodingName属性决定。
ReturnBytes:字节数组,指定要返回给发送者的字节数组。
ReturnValue:字符型,指定要返回给发送者的字符信息。
IP:         字符型,返回对方IP。
Port:       整数型,返回对方端口。

IPEndpoint: IPEndpoint型,返回对方的IPEndpoint


--  作者:andy-1024
--  发布时间:2020/7/28 14:39:00
--  
哦,好的,我先试试
[此贴子已经被作者于2020/7/28 14:40:30编辑过]

--  作者:andy-1024
--  发布时间:2020/7/31 4:49:00
--  
老师好,我尝试了好多次,还是不会,总是报错。
关于UDPClient,我感觉帮助文档里的介绍太粗略,也太少了,而且没有几个例子,实在是琢磨不明白代码应该怎么写。

我的代码如下:完全是瞎蒙的,请老师帮我指导一下,应该怎么写才能实现发送消息到远程服务器的功能。

Dim IP As String = Vars("RemoteIP")    \'定义远程服务器的IP地址变量
If UDPClients.Count = 0 Then
    UDPClients.Add("UDP1")
    UDPClients("UDP1").IP = IP
    UDPClients("UDP1").Port = 52178
    UDPClients("UDP1").Start()
    UDPClients("UDP1").Send(IP, 52178, User.Name & "|" & TBN.Value)
Else
    UDPClients(0).Send(IP, 52178, User.Name & "|" & TBN.Value)
End If

如果是系统刚启动,尚未启动UDPClient的情况下,执行上面代码,在执行语句:
    UDPClients("UDP1").Start()
的时候,报错如下:“在其上下文中,该请求的地址无效。”
然后就没有然后了。
如果再执行一次(此时UDPClient已启动),则报错如下:“给定关键字不在字典中。”

如果把
    UDPClients("UDP1").IP = IP   改为   
    UDPClients("UDP1").IP = “0.0.0.0”
则刚启动系统,执行上述代码的时候不会报错,但是远程服务器并没有接收到消息。
第二次执行上述代码的时候一样报错:“给定关键字不在字典中。”

如果把
    UDPClients("UDP1").IP = IP   改为   
    UDPClients("UDP1").IP = “127.0.0.1”
则刚启动系统,执行上述代码的时候报错如下:“向一个无法连接的网络尝试了一个套接字操作。”
第二次执行上述代码的时候一样报错:“给定关键字不在字典中。”

实在是搞不明白,请老师指教,谢谢!



--  作者:有点蓝
--  发布时间:2020/7/31 9:20:00
--  
首先至少需要2个项目。就好像要打电话,如果只有一台手机,自己打给自己有意义么?上面的代码就是自己把消息发给自己,没有意义!

A项目
Dim IP As String = A项目电脑IP    \'如果不在同一台电脑,可以设置为0.0.0.0,如果在同一台电脑测试,使用127.0.0.1
If UDPClients.Count = 0 Then
    UDPClients.Add("UDP1")
    UDPClients("UDP1").IP = IP
    UDPClients("UDP1").Port = 52178
    UDPClients("UDP1").Start()
End If

如果要给B项目发消息:(前提是B项目已经启动了UDPClients)
UDPClients("UDP1").Send(B项目电脑IP, 52179, User.Name & "|" & TBN.Value)

B项目
Dim IP As String = B项目电脑IP    \'如果不在同一台电脑,可以设置为0.0.0.0,如果在同一台电脑测试,使用127.0.0.1
If UDPClients.Count = 0 Then
    UDPClients.Add("UDP1")
    UDPClients("UDP1").IP = IP
    UDPClients("UDP1").Port = 52179 \'2个项目的打开不能一样
    UDPClients("UDP1").Start()
End If

如果要给A项目发消息:(前提是A项目已经启动了UDPClients)
UDPClients("UDP1").Send(B项目电脑IP, 52178, User.Name & "|" & TBN.Value)

也就是说UDPClient项目既可以当服务端,也可以当客户端,可以互相发消息,不需要专门的服务端,只需要知道对方的IP和端口即可

--  作者:andy-1024
--  发布时间:2020/8/1 5:11:00
--  
老师好,我按照上面的讲解,将我的代码更改如下:

对于本地电脑中的程序:

    1. 在AfterOpenProject事件中,加入开启UDPClient的代码:

    If UDPClients.Count = 0 Then
        UDPClients.Add("UDP1")
        UDPClients("UDP1").IP = "0.0.0.0"
        UDPClients("UDP1").Port = 52178
        UDPClients("UDP1").Start()
    End If

    2.在需要发送消息的功能中加入下面的代码:

    Dim IP As String = Vars("RemoteIP")    \'把远程服务器的IP地址赋给变量“IP”
    UDPClients("UDP1").Send(IP, 52179, User.Name & "|" & TBN.Value)

对于远程服务器电脑中的程序:

    1. 在AfterOpenProject事件中,加入开启UDPClient的代码:

    If UDPClients.Count = 0 Then
        UDPClients.Add("UDP1")
        UDPClients("UDP1").IP = "127.0.0.1"
        UDPClients("UDP1").Port = 52179
        UDPClients("UDP1").Start()
    End If

    2. 在UDPClient的ReceivedMessage事件中加入代码,查看是否接收到消息:

    Dim msg As String = e.Message
    MessageBox.Show(msg)     \'查看是否接收到消息
    MessageBox.Show(e.UDPclient.IP & "|" & e.UDPclient.Port)    \'如果接收到消息,尝试看看能否看到发送消息方的IP和Port

然后,我在本地机器上退出程序,再重新打开,发送消息,没有发现任何错误提示,执行完毕。
然而,远程服务器上没有弹出任何消息对话框,我尝试把IP改为“0.0.0.0”也是一样的。
不知道现在的问题出在哪里,请老师再多多指教!
谢谢!

--  作者:有点蓝
--  发布时间:2020/8/2 9:45:00
--  
对于远程服务器电脑中的程序:

    1. 在AfterOpenProject事件中,加入开启UDPClient的代码:

    If UDPClients.Count = 0 Then
        UDPClients.Add("UDP1")
        UDPClients("UDP1").IP = "
0.0.0.0"
        UDPClients("UDP1").Port = 52179 
        UDPClients("UDP1").Start()
    End If

对于本地电脑中的程序:
2.在需要发送消息的功能中加入下面的代码:

    Dim IP As String = Vars("RemoteIP")    \'如果服务器在局域网,使用服务器局域网IP;如果服务器在外网,使用服务器外网IP,如果是云服,看看:需要设置安全组和防火墙:http://www.foxtable.com/bbs/dispbbs.asp?BoardID=2&replyID=714467&ID=104284&skin=1
    UDPClients("UDP1").Send(IP, 52179, User.Name & "|" & TBN.Value)




--  作者:andy-1024
--  发布时间:2020/8/5 6:18:00
--  
老师好,按照上面的云服务器UDP端口设置说明设置后,现在服务器已经可以正常接收本地机器发送的消息了。
下面一个问题是关于IPEndpoint,帮助文档上关于UDPClient的讲解中,只有一段是关于其它vb.net开发程序中的代码示例。
关于在Foxtable中IPEndpoint的用法,我实在是不会,麻烦老师帮我讲解一下,最好能给个示例,这样更好理解。
另外,如果要从云服务器回传消息给本地发送消息的电脑,远程服务器除了开放UDP-52179,和UDP 25000-30000端口外,还需不需要开放其它端口了?
本地机器是否还需要开放什么端口或者端口范围?

--  作者:有点蓝
--  发布时间:2020/8/5 8:57:00
--  
回传消息,直接在事件里返回即可,不需要在设置什么了

ReceivedMessage

UDPClient收到信息后触发。

e参数属性:

Bytes:      字节数组,以字节数组形式返回收到的信息。
Message:    字符型,以字符形式返回收到的信息,编码格式由EncodingName属性决定。
ReturnBytes:字节数组,指定要返回给发送者的字节数组。
ReturnValue:字符型,指定要返回给发送者的字符信息。


至于示例,与ASP.NET网页进行交互示例

 

官方网站为本节内容提供了示例,下载地址:
http://www.foxtable.com/samples/UDPWeb.rar


--  作者:andy-1024
--  发布时间:2020/8/6 5:17:00
--  
好的,谢谢老师!消息发送和返回都已经成功了。
审核过程由原来的半分钟甚至将近两分钟,缩短至3秒钟完成,简直是一次质的飞跃!!
非常感谢老师的耐心指导!
[此贴子已经被作者于2020/8/6 5:19:32编辑过]