遇到的问题
在写UDP客户端的时候,出现了bind error : Cannot assign requested address报错。
我开启了UDP的服务端,端口为12345。接下来开始写客户端。
客户端必定需要声明请求的目标IP端口,所以当时一时手快,写出了下面的代码。
EventLoopGroup group = new NioEventLoopGroup();
try {
Bootstrap b = new Bootstrap();
b.group(group)
.channel(NioDatagramChannel.class)
.handler(new UdpClientHandler(contextMsg, commonClientHandler));
Channel ch = b.bind(12345).sync().channel();
ch.closeFuture().await();
} catch (Exception e) {
e.printStackTrace();
} finally {
group.shutdownGracefully();
}
于是就出现了bind error : Cannot assign requested address。
解决方法
我遇到此错误其实很简单,只是在写的过程中,被TCP接口误导导致。与开放端口等并无关系。
首先注意此处bind的端口号12345,此处的端口号含义为:
UDP客户端使用该端口对外进行请求,而非请求目标的端口。
也正因为UDP服务端和UDP客户端同时绑定了12345端口,所以导致了后启动的客户端发现端口被占用,所以产生了报错。
也就是,当时误把bind方法的参数当做目标服务器的端口,所以报出的 bind error : Cannot assign requested address
把这个端口改为其他端口即可,例如后文,我将端口从12345改为23456即避免了冲突。
也就是:
EventLoopGroup group = new NioEventLoopGroup();
try {
Bootstrap b = new Bootstrap();
b.group(group)
.channel(NioDatagramChannel.class)
.handler(new UdpClientHandler(contextMsg, commonClientHandler));
Channel ch = b.bind(23456).sync().channel();
ch.closeFuture().await();
} catch (Exception e) {
e.printStackTrace();
} finally {
group.shutdownGracefully();
}
最后在UDP发起通信时声明服务端的IP和端口即可,代码如下:
ctx.writeAndFlush(
new DatagramPacket(
Unpooled.copiedBuffer(Unpooled.copiedBuffer("xxxxxxxx")),
new InetSocketAddress("xxx.xxx.xxx.xxx", 23456)
)
).sync();