以文本方式查看主题 - 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: 字节数组,以字节数组形式返回收到的信息。 |
-- 作者: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: 字节数组,以字节数组形式返回收到的信息。 至于示例,与ASP.NET网页进行交互示例
官方网站为本节内容提供了示例,下载地址: |
-- 作者:andy-1024 -- 发布时间:2020/8/6 5:17:00 -- 好的,谢谢老师!消息发送和返回都已经成功了。 审核过程由原来的半分钟甚至将近两分钟,缩短至3秒钟完成,简直是一次质的飞跃!! 非常感谢老师的耐心指导!
[此贴子已经被作者于2020/8/6 5:19:32编辑过]
|