发布
社区首页 >问答首页 >使用UnetSocket在unet堆栈中创建客户端和服务器节点之间的通信

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

Stack Overflow用户
提问于 2021-04-28 06:06:12
回答 1查看 136关注 0票数 4

我是UnetStack这个领域的新手,非常感谢专家的帮助。

我创建了一个由4个节点组成的小网络。我正在尝试将我的客户机节点(例如节点B )连接到服务器节点(A)。我尝试了他们之间的沟通通过壳。我成功了。但当我通过探员尝试同样的方法时,我会面临错误。基本上,我的客户机代理保存客户端的套接字代码,与我的服务器的套接字代码相同。我的目标是在客户端和服务器节点之间实现功能齐全的通信。

我创建了一个服务器代理,客户机代理将这些代理添加到相应的节点堆栈中。在上述代理中,我尝试在各自代理的.groovy文件中实现服务器套接字代码和客户端套接字代码。服务器代理被添加到名为setup1.groovy的安装文件中,而客户机代理则添加到setup2.groovy中。这些文件的路径在模拟脚本中各自节点的堆栈部分中提到。但是,我仍然面临以下错误:

代码语言:javascript
代码运行次数:0
复制
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)

代码语言:javascript
代码运行次数:0
复制
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)

代码语言:javascript
代码运行次数:0
复制
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()
    })
  } 
}

模拟脚本

代码语言:javascript
代码运行次数:0
复制
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

代码语言:javascript
代码运行次数:0
复制
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)

client文件采用相同的格式,但在这种情况下添加的代理是客户端。

谢谢。致以敬意,

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-04-28 06:25:52

您所看到的错误的重要部分是

代码语言:javascript
代码运行次数:0
复制
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),

换句话说,您所调用的connect方法使用的是String类型的第一个参数和int类型的第二个参数。但是,不存在这样的方法,因此出现了“方法的无签名”错误。

实际上,编译器提示了其他可能有用的方法,包括将int作为两个参数的方法,这是您应该使用的方法。

因此,更改客户端代码应该有助于解决这个问题。

代码语言:javascript
代码运行次数:0
复制
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秒创建一个新套接字。你可能不想这么做。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67294584

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档