如何解决使用 UnetSocket
我是 UnetStack 这个领域的新手,希望得到专家的帮助。
我创建了一个由 4 个节点组成的小型网络。我正在尝试连接我的客户端节点,例如节点 B,到服务器节点 (A)。我尝试通过shell进行它们之间的通信。我在这方面取得了成功。但是当我通过代理尝试相同时,我遇到了错误。基本上,我的客户端代理保存客户端的套接字代码,我的服务器也是如此。我的目标是在客户端和服务器节点之间进行功能齐全的通信。
我创建了一个服务器代理,客户端代理将这些代理添加到各自的节点堆栈中。在上述代理中,我尝试在相应代理的 .groovy 文件中实现我的服务器套接字代码和客户端套接字代码。服务器代理添加到名为 setup1.groovy
的安装文件中,而客户端代理添加到 setup2.groovy
中。模拟脚本中相应节点的堆栈部分中提到了这些相应文件的路径。但是,我仍然面临以下错误:
SEVERE: Client/B > Agent cli died: groovy.lang.MissingMethodException: No signature of method: org.arl.unet.api.UnetSocket.connect() is applicable for argument types: (String,Integer) values: [1,0]
Possible solutions: connect(int,int),collect(),disconnect(),cancel(),collect(groovy.lang.Closure),collect(java.util.Collection,groovy.lang.Closure)
我附上了我的模拟和代理脚本以获得更多见解。
服务器代理文件(server.groovy)
import org.arl.fjage.*
import org.arl.unet.*
import java.lang.String
//import org.arl.fjage.Agent
import org.arl.unet.api.UnetSocket
class server extends UnetAgent {
@Override
void startup() {
def sock = new UnetSocket('localhost',1105)
println('Server is active Now!!!!!')
sock.bind(Protocol.DATA)
def rx= sock.receive()
println(rx.from,rx.to,rx.data)
sock.close()
}
}
客户端代理文件(client.groovy)
import org.arl.fjage.*
import org.arl.unet.*
import java.lang.String
import org.arl.fjage.Agent
import org.arl.unet.api.UnetSocket
class Client extends UnetAgent {
@Override
void startup() {
add new WakerBehavior(5000,{
def sock= new UnetSocket('localhost',1102)
//def to = sock.host('A')
println('Client Created!!!!!!')
sock.connect('1',Protocol.DATA)
sock.send('Connected!!!' as byte[])
sock.send('Successfully' as byte[])
sock.close()
})
}
}
模拟脚本
import org.arl.fjage.*
//import org.arl.unet.*
///////////////////////////////////////////////////////////////////////////////
// display documentation
println '''
my-node network
--------------
Node A: tcp://localhost:1105,http://localhost:8081/
Node B: tcp://localhost:1102,http://localhost:8082/
Node C: tcp://localhost:1103,http://localhost:8083/
Node D: tcp://localhost:1104,http://localhost:8084/
'''
///////////////////////////////////////////////////////////////////////////////
// simulator configuration
platform = RealTimePlatform // use real-time mode
// run the simulation forever
simulate {
node 'A',address:1,location: [ 0.km,0.km,-15.m],web: 8081,api: 1105,stack: "$home/etc/setup1"
node 'B',address:2,location: [ -1.km,1.7.km,web: 8082,api: 1102,stack:"$home/etc/setup2"
node 'C',address:3,location: [ 0.8.km,-1.km,web: 8083,api: 1103,stack: "$home/etc/setup"
node 'D',address:4,location: [ 1.5.km,web: 8084,api: 1104,stack: "$home/etc/setup"
}
setup1(服务器端安装文件)setup1.groovy
import org.arl.fjage.Agent
import java.lang.String
boolean loadAgentByClass(String name,String clazz) {
try {
container.add name,Class.forName(clazz).newInstance()
return true
} catch (Exception ex) {
return false
}
}
boolean loadAgentByClass(String name,String... clazzes) {
for (String clazz: clazzes) {
if (loadAgentByClass(name,clazz)) return true
}
return false
}
loadAgentByClass 'arp','org.arl.unet.addr.AddressResolution'
loadAgentByClass 'ranging','org.arl.unet.localization.Ranging'
loadAgentByClass 'mac','org.arl.unet.mac.CSMA'
loadAgentByClass 'uwlink','org.arl.unet.link.ECLink','org.arl.unet.link.ReliableLink'
loadAgentByClass 'transport','org.arl.unet.transport.SWTransport'
loadAgentByClass 'router','org.arl.unet.net.Router'
loadAgentByClass 'rdp','org.arl.unet.net.RoutediscoveryProtocol'
loadAgentByClass 'statemanager','org.arl.unet.state.StateManager'
container.add 'serv',new server()
container.add 'remote',new org.arl.unet.remote.RemoteControl(cwd: new File(home,'scripts'),enable: false)
container.add 'bbmon',new org.arl.unet.bb.BasebandSignalMonitor(new File(home,'logs/signals-0.txt').path,64)
Setup2.groovy 文件遵循相同的格式,但在这种情况下添加的代理是客户端。
谢谢。 问候,
解决方法
您看到的错误的重要部分是
No signature of method: org.arl.unet.api.UnetSocket.connect() is applicable for argument types: (String,Integer) values: [1,0]
Possible solutions: connect(int,int),
换句话说,您在 UnetSocket 上调用的 connect
方法的第一个参数为 String
类型,第二个参数为 int
类型。但是,不存在这样的方法,因此出现“无方法签名”错误。
事实上,编译器暗示了其他可能有用的方法,包括将 int
作为两个参数的方法,这是您应该使用的方法。
因此更改您的客户端代码应该有助于解决这个问题。
void startup() {
add new WakerBehavior(5000,{
def sock= new UnetSocket('localhost',1102)
//def to = sock.host('A')
println('Client Created!!!!!!')
sock.connect(1,Protocol.DATA)
sock.send('Connected!!!' as byte[])
sock.send('Successfully' as byte[])
sock.close()
})
}
请注意,您正在 WakerBehaviour 中创建一个新套接字,因此您将每 5 秒创建一个新套接字。您可能不想这样做。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。