jeanlove 发表于 2009-04-27 18:58:22

ServerSocket是否区分ipv4/ipv6? ftp的问题。

我使用FileZilla作为ftp的工具,连接一个unix服务器的时候,命令字显示USER,PASS,PWD,进入一个目录的时候命令字显示TYPE I,PASV,LIST结果正确。

    然后我自己用java的ServerSocket来实现一个ftp的服务器,new ServerSocket(port号).accept()监听。用ftp去连接,处理了USER和PASS命令字以后(USER,PASS,PWD 登陆没有问题),java代码里面立刻返回一个Socket对象sock,然后打印客户端传过来的内容sock.readLine看看ftp客户端传过来了什么。

显示的结果是和IPV6有关的:客户端敲dir命令以后服务器显示sock.readLine()的内容:
TYPE I
EPSV
EPRT |2|::1|1191|
LIST

然后java实现的ftp服务器就卡死了,然后客户端超时。

问题:
---------------------------
为什么我写的ftp代码,让客户端连接以后运行ftp的命令,dir就传的是EPSV这样的指令字,难道和ServerSocket的类型有关吗? 为什么客户端没有去使用PASV,LIST这样的指令字?
     没有PASV的内容,我无法用一个新的ServerSocket来accept和传送目录内容;同理没有得到PORT的内容,无法得到客户端打开的端口号,同样无法通信。

平台是WinXP+jdk6。

如何解决呢? 为什么客户端把我的ftp服务器实现当作IPv6的来给命令字? 我的机器上只有ipv4啊。

[ 本帖最后由 jeanlove 于 2009-4-27 19:00 编辑 ]

ziggler 发表于 2009-04-27 18:58:23

回复 #1 jeanlove 的帖子

JAVA平台软件如何升级支持IPv4/IPv6双协议栈
Java

属于网络层的支持,需要网络软硬件环境支持,包括路由器,DNS服务器,操作系统等等。目前windows XP SP1或以上版本/windows 2003都支持IPv4/IPv6双栈,Linux很早就支持IPV6,内核是2.1.2或以上版本即可,Solaris 8或以上版本。配置方法参见北京大学计算中心网页:https://its.pku.edu.cn/cysz/ipv6.jsp


Java平台应用系统软件支持IPv4/IPv6:


相对其他开发语言而言,Java对IPv6的支持是比较透明的,如果全部采用域名的方式进行通信,那么基本不需要修改也无需编译原来的代码就可以直接在IPv6上运行。


1,作为Server端


Windows平台必须升级到JDK/JRE 5.0或以上版本,其他平台JDK/JRE应该至少使用1.4.2版本。


使用Tomcat,jetty等web服务器的Web应用,缺省将监听本地所有IP地址,包括IPv6和IPv4。


自己写的ServerSocket,在调用ServerSocket.accept时候如果监听没有指定绑定地址,则将监听本地所有IP地址。如果只监听了IPv4的地址,则只能接受IPv4的包。


2,作为Client端


Windows平台必须升级到JDK/JRE 5.0或以上版本,其他平台JDK/JRE应该至少使用1.4.2版本。


如果Socket连接使用域名进行访问,则不会有任何问题,如果使用的是IPv4的地址,那么对方必须是IPv4或者IPv4/IPv6双栈节点。


使用URL方式访问IPv6地址时候,要在IPv6地址前后分别加"["和"]",这个不仅仅适用于Java,它本身是RFC2732定义的国际标准格式。比如下面是个包含IPv6的http URL的例子http://:80/index.html

http://www.kingxy.com/archives/52.html

http://snipurl.com/guh0s

[ 本帖最后由 ziggler 于 2009-4-28 00:09 编辑 ]

jeanlove 发表于 2009-04-28 10:25:59

原帖由 ziggler 于 2009-4-28 00:08 发表 http://bbs2.chinaunix.net/images/common/back.gif
JAVA平台软件如何升级支持IPv4/IPv6双协议栈
Java

属于网络层的支持,需要网络软硬件环境支持,包括路由器,DNS服务器,操作系统等等。目前windows XP SP1或以上版本/windows 2003都支持IPv4/IPv6双栈,Lin ...

谢谢,问题具体是这样的:
ServerSocket s=new ServerSocket(iPort);//listening to port
Socket socket=s.accept();

然后,用Filezillar可以连接我写的ftp服务器,netstat也能看到XXXX.local:ftp ESTABLISHED状态,断开Filezilla以后变成FIN_WAIT_2状态。连接的时候,地址用用本地的局域网IP或者127.0.0.1都没有问题,我的程序处理了USER,PASS,PWD等命令字,Filezilla输出如下:
状态:        正在连接 127.0.0.1:21...
状态:        连接建立,等待欢迎消息...
返回:        220-Welcome......
返回:        220 This ftp server run in DP system
命令:        USER jeanlove
返回:        331 need password
命令:        PASS *****
返回:        230 welcome to my ftp!
状态:        已连接
状态:        读取目录列表...
命令:        PWD
返回:        257 "/" is current directory.
状态:        列目录成功

但是如果写成localhost就有问题,似乎就去当成IPV6了,Filezilla的输出是:
状态:        已从服务器断开
状态:        正在解析 localhost  的 IP 地址
状态:        正在连接 [::1]:21...
状态:        连接建立,等待欢迎消息...
返回:        220-Welcome......
返回:        220 This ftp server run in DP system
命令:        USER jeanlove
返回:        331 need password
命令:        PASS *****
返回:        230 welcome to my ftp!
状态:        已连接
状态:        读取目录列表...
命令:        PWD
返回:        257 "/" is current directory.
命令:        TYPE I                                        ->为什么客户端多发送了一个TYPE I 命令
返回:        200 TYPE set to I.
命令:        EPSV                                          ->为什么就变成了按照IPV6去连接呢?
返回:        200 command successful.
命令:        EPRT |2|::1|1218|                      ->就是IPv6的::格式
返回:        200 command successful.
命令:        LIST

如果我对程序修改一下,
ServerSocket s=new ServerSocket();
s.bind(new InetSocketAddress("xx.xx.x.xxx",iPort);//我自己的局域网IP地址
socket=s.accept();

那么FileZilla就会去连127.0.0.1并且是当作IPV6来处理,Filezilla甚至不能建立连接
正在连接 10.xx.x.xxx:21...
状态:        尝试连接失败 "ECONNREFUSED - Connection refused by server"

[ 本帖最后由 jeanlove 于 2009-4-28 10:29 编辑 ]

jeanlove 发表于 2009-04-29 09:32:14

呼唤dx的解答!

jeanlove 发表于 2009-05-13 15:28:27

自己顶一下哈:D

ziggler 发表于 2009-05-13 16:11:42

关键问题是为啥会当成IPV6的地址那?

搞清楚这个规则就OK了。

jeanlove 发表于 2009-05-13 18:08:44

原帖由 ziggler 于 2009-5-13 16:11 发表 http://bbs2.chinaunix.net/images/common/back.gif
关键问题是为啥会当成IPV6的地址那?

搞清楚这个规则就OK了。

就是不知道啊,不解..... :(
页: [1]
查看完整版本: ServerSocket是否区分ipv4/ipv6? ftp的问题。