2016-01-13 2 views
0

Когда я связываю «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); 
      } 
     } 
    }); 
} 
+0

Чтобы улучшить свой вопрос: укажите, появляется ли ошибка на клиенте или сервере, добавьте тег java к вашему вопросу и отформатируйте это исключение как блок кода. – Ferrybig

+0

Если вы находитесь в беспроводной сети, вы можете попробовать запустить JVM с помощью «-Djava.net.preferIPv4Stack = true». – Trugath

ответ

0

Вы уверены, что адрес вы обеспечиваете (172.16.3.138) является адрес компьютера, на котором запущена программа на?

Связывание с IP-адресом, отличным от loopback и localhost, предназначено для привязки к другому сетевому адаптеру (на том же компьютере).

+0

Да, я уверен. Это мой Lan ip. – henrybit

+0

Поскольку это Mac, может быть, возможно, что у java нет необходимых прав для привязки к этому IP-адресу? – Limnic

+0

На самом деле иногда бывает хорошо, иногда исключение исключает. Отсутствие прав доступа. Связывание сервера 8888 в порядке. lsof -i: 8888 java 7231 henrybit 149u IPv6 0xceffd64b62114f49 0t0 TCP 172.16.3.138:ddi-tcp-1 (LISTEN) – henrybit

0

Когда вы звоните в 127.0.0.1:8888, вы напрямую подключаетесь к вашей собственной машине, и порт 8888 в этом случае открыт. Но когда вы звоните в 172.16.3.138:8888, вы также подключаетесь к своей собственной машине, но вам нужно пройти через маршрутизатор или другой прокси-сервер, который мог бы закрыть порт 8888. Проверьте это и повторите попытку. (возможно, вам нужно открыть порт 8888 в маршрутизаторе).

Смежные вопросы