使用UnetSocket在unetstack中创建客户端和服务器节点之间的通信

4

我是这个UnetStack领域的新手,希望能得到专家的帮助。

我已经创建了一个由4个节点组成的小型网络。我正尝试将我的客户端节点(例如节点B)连接到服务器节点(A)。我尝试通过控制台之间进行通信,成功了。但是当我尝试通过agents进行通信时,出现错误。基本上,我的客户端agent持有客户端的socket代码,我的服务器也是同样的情况。我的目标是使客户端和服务器节点之间实现完全功能的通信。

我创建了一个服务器agent,并将客户端agent添加到各自的节点堆栈中。在上述的代理程序中,我尝试在各自的代理程序的 .groovy 文件中实现我的服务器socket代码和客户端socket代码。服务器agent添加在名为 setup1.groovy 的设置文件中,而客户端agent添加在 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, -15.m], web: 8082, api: 1102, stack:"$home/etc/setup2"
  node 'C', address:3, location: [ 0.8.km, -1.km, -15.m], web: 8083, api: 1103, stack: "$home/etc/setup"
  node 'D', address:4, location: [ 1.5.km, 1.7.km, -15.m], 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文件遵循相同的格式,但在该案例中添加的代理是客户端。

谢谢。 敬礼,

1个回答

5
你看到的错误信息中重要的部分是:
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。然而,这样的方法并不存在,因此会出现 "No signature of method" 错误。
实际上,编译器提示可能还有其他可能有用的方法,其中包括接受两个 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中创建一个新的socket,因此您将每5秒钟创建一个新的socket。您可能不想这样做。


1
感谢您的回复。您的建议对我很有帮助。在实施您的建议并进行一些更改后,我的模拟运行良好。 - Yash Madwanna

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接