我正在用java写一个ftp的服务器端,我现在处理abor这个命令发现了一点小问题:
有些ftp软件(cuteFTP)会直接发送ABOR给服务器端,某些ftp客户端软件(例如我用来测试的leapFTP)在发送abor给服务器端之前,总会先发送一些其它数据,这是我用ethereal抓到的一些会话的包:
request: \377\364
request: \377\362
request: ABOR
那些\377\364 \377\362好像是与telnet协议有关的东西,我用socket接受的话必须利用socket.setOOBInline(true)打开紧急数据接受才能接收到,但是我接受到的东西是这个“駻BOR”,其16进制表示成"3f f2 41 42 4f 52",很容易看出
“41 42 4f 52”就是"ABOR"的asc码,但是前面的“3f f2”是什么东西呢?而且他们也不能转换城string类型,java中有没有什么方法可以去除掉那些东西只保留abor呢?
请求达人回答,高分悬赏!!
有些ftp软件(cuteFTP)会直接发送ABOR给服务器端,某些ftp客户端软件(例如我用来测试的leapFTP)在发送abor给服务器端之前,总会先发送一些其它数据,这是我用ethereal抓到的一些会话的包:
request: \377\364
request: \377\362
request: ABOR
那些\377\364 \377\362好像是与telnet协议有关的东西,我用socket接受的话必须利用socket.setOOBInline(true)打开紧急数据接受才能接收到,但是我接受到的东西是这个“駻BOR”,其16进制表示成"3f f2 41 42 4f 52",很容易看出
“41 42 4f 52”就是"ABOR"的asc码,但是前面的“3f f2”是什么东西呢?而且他们也不能转换城string类型,java中有没有什么方法可以去除掉那些东西只保留abor呢?
请求达人回答,高分悬赏!!
这要看ftp客户端是用什么编码方式发数据的。
如果ftp客户端是用UTF-8发送的,你的ftp服务器也要按照指定UTF-8编码方式以流的形式读入数据。
关键要看你的ftp客户端是用什么编码方式发数据的,你的ftp服务器也要按相同的编码读入。
这样就可以了,我前几天遇到过这个问题的
Response: 200 Type set to I.
Request: PORT 222,201,190,47,13,147
Response: 200 PORT Command successful.
Request: REST 56254464
Response: 350 Restarting at 56254464. Send STORE or RETRIEVE.
Request: RETR \277\313\302\241\325\275\312\277a.scm(注:克隆战士a.scm)
Response: 150 Opening BINARY mode data connection for ........a.scm (261164289 Bytes).
Request: \377\364
Request: \377\362
Request: ABOR
Response: 426 Data connection closed, file transfer ........a.scm aborted by client.
Response: 226 ABOR command successful.Request: QUIT221 Goodbye!
Request: QUIT
Response: 221 Goodbye!
1)你说得没错,\377\364 \377\362就是telnet协议中规定的操作,我翻译一下(操作序列):
'IAC' 'Interrupt Process' 'IAC' 'Data Mark'
其中:(1)\364表示操作:'Interrupt Process',即实施telnet的The function IP。含义:ftp客户机告诉你这个FTP服务器,赶快放下你现在手头的事情,马上处理我的事件(我有紧急数据到来)。
(2)\362表示操作:'Data Mark',这个字节是ftp客户机以TCP的紧急模式发送的一个字节。含义:即:其后的数据必须立即读取。
(3)\377即IAC,是telnet中的转义字节(即:255),每一个telnet操作(如:\364、\362)都必须以IAC开始。
2)很简单,这个序列是固定的即称为telnet的[IP,Synch]序列。我没有看过你的程序,但通过理论分析,你应该收到的是“f2 41 42 4f 52”,因为f2是通过TCP紧急模式发送的一个字节而已。你只要将字节f2(即telnet操作:\362)丢弃即可以了。以上仅供你参考
学习了