2016-07-27 46 views
-1

我用this制作了NIO套接字客户端和服务器。它在本地机器上正常工作。我在泊坞窗容器部署NIO_Server.jar这个args是7878端口:Java NIO Socket在windows和unix之间的docker中出现故障

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端口会隐式公开。

[email protected]:~# docker run -ti --net=host -v $HOME:/usr/app -w /usr/app --name=test java:7 java -jar NIO_Server.jar 
EchoServer started... 

我想确保它是内部主机的工作:

[email protected]:~# netstat -antu | grep 7878 
tcp6  0  0 127.0.0.1:7878   :::*     LISTEN 
[email protected]:~# 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 \ MONSTER MASH>的telnet 31.148.99.130 7878连接到 31.148.99.130 ......无法打开连接到主机,在端口7878:连接失败

但平:

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配置:

[email protected]:~# 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上。问题是一样的。

+0

@Dominic Cerisano我解决了问题。另一个像双赢的例子,unix-unix也没有工作。我的答案是不正确的,但套接字服务器地址应该有硬件适配器的ip。 '-p'不起作用,因为它是桥梁。使用选项'docker run --net = host --name = test --rm -v $ HOME:/ usr/app java:7 java -jar /usr/app/NIO_Server.jar 31.148.99.130 7979' – QQRuZa

回答

0

你应该在这两种环境下都发送一个数据包嗅探器并查看NIO有效载荷。

Linux和Windows库可以颠倒endianity(小vs大)。握手可能失败,因为一方是“左撇子”,另一方是“右撇子”。

在你的NIO API中为一个endian交换机着想。做一个操作系统检查客户端,并确保它的NIO消息适合服务器。

这被称为操作系统的“边界条件”,它似乎尤其如此。在Windows和Linux之间。

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

您可能想要使用更高层次的NIO框架(例如Netty),它可以像浏览器一样处理许多边界条件。