おのたく日記 YouTubeも始めました→
2009-12-26(Sat) sun-java6-jdkでServerSocketが開けない! [長年日記]
■ [Debian]sun-java6-jdkでServerSocketが開けない!
「webAccess起動せず」を調べていくと、VMwareの使っているTomcatだけではなくて、単純な
import java.net.InetAddress;
import java.net.ServerSocket;
import java.io.IOException;
import java.net.InetSocketAddress;
public class ListenTest {
public static void main(String[] args){
int port = 8005;
ServerSocket serverSocket = null;
InetSocketAddress inetSocketAddress = null;
InetAddress ip = null;
try {
ip = InetAddress.getByName("localhost");
serverSocket =
new ServerSocket(port, 1, ip);
System.out.println("ServerSocket=" + serverSocket );
serverSocket.close();
} catch (IOException e) {
System.err.println("StandardServer.await: create[" + port + "]: " + e);
e.printStackTrace();
System.exit(1);
}
}
}
というJavaのテストプログラムでも
$ java -cp . ListenTest
InetAddress=localhost/127.0.0.1
HostAddress=127.0.0.1
HostName=localhost
StandardServer.await: create[8005]: java.net.SocketException: Invalid argument
java.net.SocketException: Invalid argument
at java.net.PlainSocketImpl.socketBind(Native Method)
at java.net.AbstractPlainSocketImpl.bind(AbstractPlainSocketImpl.java:336)
at java.net.ServerSocket.bind(ServerSocket.java:336)
at java.net.ServerSocket.
(ServerSocket.java:202) at ListenTest.main(ListenTest.java:xx)
という感じでエラーになる。これはVMwareの問題ではないことが判明。
「new ServerSocket(port, 1, ip);」を「new ServerSocket(port, 1);」とIPアドレス指定なしにすると動作するし、Sun系統のJavaではないgijならば問題なく動く。
なんとなくIPv6周りの問題だと思いながらも中々解決策みつけられなかったけど、「site:bugs.debian.org "java.net.SocketException:"」で検索して、
This setting breaks networking in java, and any traffic will always
result in a "java.net.SocketException: Network is unreachable".
It should probably be an rc-bug, but setting as important for now, since
users can easily rectify the issue.
Quick fix for users hit by this:
sudo sed -i "s/net.ipv6.bindv6only\ =\ 1/net.ipv6.bindv6only\ =\ 0/" \
/etc/sysctl.d/bindv6only.conf && sudo invoke-rc.d procps restart
[Debian Bug report logs - #560044 net.ipv6.bindv6only=1 breaks java networkingより引用]
というのを見つけた。
net.ipv6.bindv6only = 0
[/etc/sysctl.d/bindv6only.confより引用]
とすると
$ java -cp . ListenTest
InetAddress=localhost/127.0.0.1
HostAddress=127.0.0.1
HostName=localhost
ServerSocket=ServerSocket[addr=localhost/127.0.0.1,port=0,localport=8005]
と、ちゃんと動くようになって、VMwareのwebAccessも使えるようになった。
|