Когда я связываю «127.0.0.1», она работает без исключения, но когда я связываю «172.16.3.138», после того, как она работает в течение 15 секунд, генерируется исключение:java.net.SocketException в Нетти
java.net.SocketException: Невозможно назначить запрошенный адрес: /172.16.3.138: 8888
Я использую Нетти-4,033 на Mac.
Мой код сервера:
EventLoopGroup masterGroup = null;
EventLoopGroup workGroup = null;
try {
masterGroup = new NioEventLoopGroup();
workGroup = new NioEventLoopGroup();
ServerBootstrap serverBootstrap = new ServerBootstrap();
serverBootstrap.group(masterGroup, workGroup)
.channel(NioServerSocketChannel.class)
.childHandler(childHandler)
.option(ChannelOption.SO_BACKLOG, 100)
.childOption(ChannelOption.SO_KEEPALIVE, true);
ChannelFuture channelFuture = serverBootstrap.bind(new InetSocketAddress("0.0.0.0",port)).sync();
channelFuture.channel().closeFuture().sync();
} catch (Exception e) {
BaseLog.logger.error("netty server start failed",e);
} finally {
if (workGroup != null)
workGroup.shutdownGracefully();
if (masterGroup != null)
masterGroup.shutdownGracefully();
}
Мой клиент Код:
public void run() {
EventLoopGroup group = null;
int initTimes = 0;
while (true) {
try {
if (initTimes > 50) {
BaseLog.logger.error("try 50 times to create NioEvent,failed");
break;
}
group = new NioEventLoopGroup();
break;
} catch (Exception e) {
initTimes++;
sleep(300);
continue;
}
}
try {
Bootstrap bootstrap = new Bootstrap().group(group)
.channel(NioSocketChannel.class)
.handler(handler)
.option(ChannelOption.SO_KEEPALIVE, true);
int tryTimes = 1;
channel = null;
connect(bootstrap,tryTimes);
} catch (Exception e) {
e.printStackTrace();
BaseLog.logger.error("try 5 times,netty client connect failed",e);
} finally {
if (group != null)
group.shutdownGracefully();
}
}
protected void connect(final Bootstrap bootstrap, final int tryTimes) throws InterruptedException, NettyConnectionException {
if (tryTimes > 5)
throw new NettyConnectionException("try 5 times failed");
ChannelFuture channelFuture = null;
if (!StringUtil.isEmpty(host) && !host.equals("127.0.0.1") && !host.equals("localhost")) {
channelFuture = bootstrap.connect(new InetSocketAddress(host, port)).sync();
}
else
channelFuture = bootstrap.connect(host, port).sync();
if (channelFuture == null) return;
channelFuture.addListener(new ChannelFutureListener() {
@Override
public void operationComplete(ChannelFuture future) throws Exception {
if (future.isSuccess()) {
channel = future.channel();
sendDatas(objs);
} else {
connect(bootstrap, tryTimes+1);
}
}
});
}
Чтобы улучшить свой вопрос: укажите, появляется ли ошибка на клиенте или сервере, добавьте тег java к вашему вопросу и отформатируйте это исключение как блок кода. – Ferrybig
Если вы находитесь в беспроводной сети, вы можете попробовать запустить JVM с помощью «-Djava.net.preferIPv4Stack = true». – Trugath