Windows和unix之间的Docker内的Java NIO Socket失败了

时间:2016-07-27 21:10:33

标签: sockets unix docker nio

我通过this创建了NIO套接字客户端和服务器。它在本地机器上工作正常。我在docker container上部署了NIO_Server.jar,在7878端口上使用了这个args:

docker run -ti --net=host -v $HOME:/usr/app -w /usr/app --name=test java:7 java -jar NIO_Server.jar

并且服务器成功启动。请注意,我设置了--net=host -p选项具有相同的效果。我没有使用--expose,因为隐式显示-p个端口。

root@bess2:~# docker run -ti --net=host -v $HOME:/usr/app -w /usr/app --name=test java:7 java -jar NIO_Server.jar 
EchoServer started...

我想确保它在主机内工作:

root@bess2:~# netstat -antu | grep 7878
tcp6       0      0 127.0.0.1:7878          :::*                   LISTEN
root@bess2:~# telnet localhost 7878
Trying ::1...
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.

在容器内部,我看到事件:

EchoServer started...
Something received...
It is acceptable...
Connected to: /127.0.0.1:55974
Something received...
It is readable...
Something received...
It is readable...

但是在本地机器上我尝试在主机服务器上连接失败:

  

C:\ Users \ MONSTERMASH> telnet 31.148.99.130 7878正在连接到   31.148.99.130 ...无法在端口7878上打开与主机的连接:连接失败

但是用ping:

C:\Users\MONSTERMASH>ping 31.148.99.130

Pinging 31.148.99.130 with 32 bytes of data:
Reply from 31.148.99.130: bytes=32 time=16ms TTL=56
Reply from 31.148.99.130: bytes=32 time=16ms TTL=56
Reply from 31.148.99.130: bytes=32 time=21ms TTL=56
Reply from 31.148.99.130: bytes=32 time=18ms TTL=56

Ping statistics for 31.148.99.130:
    Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
    Minimum = 16ms, Maximum = 21ms, Average = 17ms

这是来自主机的IP配置:

root@filesbess2:~# ifconfig 
docker0   Link encap:Ethernet  HWaddr 02:42:81:11:7b:c7
          inet addr:172.17.0.1  Bcast:0.0.0.0  Mask:255.255.0.0
          inet6 addr: fe80::42:81ff:fe11:7bc7/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:401 errors:0 dropped:0 overruns:0 frame:0
          TX packets:28 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:27254 (27.2 KB)  TX bytes:6704 (6.7 KB)

eth0      Link encap:Ethernet  HWaddr 52:54:00:97:1e:86
          inet addr:31.148.99.130  Bcast:31.148.99.255  Mask:255.255.255.0
          inet6 addr: fe80::5054:ff:fe97:1e86/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:137351 errors:0 dropped:0 overruns:0 frame:0
          TX packets:577681422 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:10756344 (10.7 MB)  TX bytes:534585313126 (534.5 GB)

本地计算机和主机上的防火墙和防病毒软件已关闭或处于非活动状态。主机Ubuntu 14.04在KVM上部署。我做了这个测试,主机已部署在virtualbox上。问题是一样的。

1 个答案:

答案 0 :(得分:0)

您应该在两个环境中抛出数据包嗅探器并查看NIO有效负载。

Linux和Windows库可以具有反向字节(小与大)。握手可能会失败,因为一个是左手"而另一个是"右手"。

在您的NIO API中根据endian开关进行操作。在客户端进行操作系统检查,确保服务器的NIO消息正确定位。

这被称为OS"边界条件",它出现在esp中。在windows和linux之间。

同时检查有效负载中的空白和填充,并确保两个环境中的NIO版本兼容。

您可能希望使用更高级别的NIO框架(例如Netty)来处理许多边界条件,就像浏览器一样。