Foxtable(狐表)用户栏目专家坐堂 → UDPClient端口问题


  共有3259人关注过本帖树形打印复制链接

主题:UDPClient端口问题

帅哥哟,离线,有人找我吗?
andy-1024
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:幼狐 帖子:182 积分:1592 威望:0 精华:0 注册:2016/11/10 10:14:00
UDPClient端口问题  发帖心情 Post By:2020/7/28 5:38:00 [只看该作者]

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


 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:109720 积分:558310 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By: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
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:幼狐 帖子:182 积分:1592 威望:0 精华:0 注册:2016/11/10 10:14:00
  发帖心情 Post By:2020/7/28 14:39:00 [只看该作者]

哦,好的,我先试试
[此贴子已经被作者于2020/7/28 14:40:30编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
andy-1024
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:幼狐 帖子:182 积分:1592 威望:0 精华:0 注册:2016/11/10 10:14:00
  发帖心情 Post By: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”
则刚启动系统,执行上述代码的时候报错如下:“向一个无法连接的网络尝试了一个套接字操作。”
第二次执行上述代码的时候一样报错:“给定关键字不在字典中。”

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



 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:109720 积分:558310 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By: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
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:幼狐 帖子:182 积分:1592 威望:0 精华:0 注册:2016/11/10 10:14:00
  发帖心情 Post By: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”也是一样的。
不知道现在的问题出在哪里,请老师再多多指教!
谢谢!

 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  7楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:109720 积分:558310 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By: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
  8楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:幼狐 帖子:182 积分:1592 威望:0 精华:0 注册:2016/11/10 10:14:00
  发帖心情 Post By:2020/8/5 6:18:00 [只看该作者]

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

 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  9楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:109720 积分:558310 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By: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
  10楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:幼狐 帖子:182 积分:1592 威望:0 精华:0 注册:2016/11/10 10:14:00
  发帖心情 Post By:2020/8/6 5:17:00 [只看该作者]

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

 回到顶部