【Netty4】UDP Client报错:bind error : Cannot assign requested address

遇到的问题

在写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();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值