【问题标题】:How to parse TCP/IP packets from socket in Java?如何在 Java 中解析来自套接字的 TCP/IP 数据包?
【发布时间】:2018-05-13 01:10:30
【问题描述】:

我有来自套接字InputStream sin = socket.getInputStream(); 的 InputStream。我想从这个套接字解析 TCP/IP 数据包以获取目标主机和端口。 我该怎么做? 有什么建议吗?

更新

当打印出套接字的所有内容时:

bytes = sin.readAllBytes();
System.out.println("-> " + sin);
System.out.println("-> -> " + sin.read());
for (int i = 0; i < bytes.length; i++) {
    System.out.println("++ -> " + bytes[i]);
}

我有类似的东西:

-> java.net.SocketInputStream@36d64342
-> -> -1
++ -> 71
++ -> 69
++ -> 84
++ -> 32
++ -> 104
++ -> 116
++ -> 116
++ -> 112
++ -> 58
++ -> 47
++ -> 47
++ -> 50
++ -> 105
++ -> 112
++ -> 46
++ -> 114
++ -> 117
++ -> 47
++ -> 102
++ -> 97
++ -> 118
++ -> 105
++ -> 99
++ -> 111
++ -> 110
++ -> 46
++ -> 105
++ -> 99
++ -> 111
++ -> 32
++ -> 72
++ -> 84
++ -> 84
++ -> 80
++ -> 47
++ -> 49
++ -> 46
++ -> 49
++ -> 13
++ -> 10
++ -> 72
++ -> 111
++ -> 115
++ -> 116
++ -> 58
++ -> 32
++ -> 50

这是我打印的字节数组的一部分。

UPD2

当我将字节转换为字符时,我有这个:

GET http://2ip.ru/ HTTP/1.1
Host: 2ip.ru
Proxy-Connection: keep-alive
Accept
text/html,application/xhtml+xml,application/
xml;q=0.9,image/webp,*/*;q=0.8
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Linux; Android 5.1; M3s Build/LMY47I; wv)
AppleWebKit/537.36 (KHTML, like Gecko)
Version/4.0 Chrome/44.0.2403.146     Mobile Safari/537.36
Accept-Encoding: gzip, deflate
Accept-Language: ru-RU,en-US;q=0.8
Cookie: PHPSESSID=enph0vckkk9t1hqaglch3b6693;
IP%5B1511541539%5D=96.94.32.50;
__gads=ID=88de3c23be0f84e7:T=1511541553:S
=ALNI_MZbnsWDJcRSBUodYKfLeCg9pjw
YQw; _ym_uid=1511541569449405305; 
IP%5B1511886512%5D=217.77.220.27;
__utma=260173902.2002453512.1511541552.1511886514.
1511953525.5;
__utmc=260173902; __utmz=260173902.1511541565.1.1.utmcsr
=(direct)|utmccn=    (direct)|utmcmd=(none)
X-Requested-With: com.vestasoft.vadim.proxynator

【问题讨论】:

  • “数据包”是什么意思? TCP/IP 数据包?
  • 是的,当然。
  • 这些字节拼写出“�GET 2ip.ru/favicon.ico HTTP/1.1 Host: 2”。打印字母而不是数字可能更有用(只需将每个字节转换为字符)
  • 看起来不错。但我没有主机端口。稍等一下,我会更新我的问题。
  • 它看起来想要“GET 2ip.ru HTTP/1.1”和“Host: 2ip.ru”。由于没有指定端口,如果你尝试使用默认的 http 端口(80)会发生什么?

标签: java sockets parsing packet


【解决方案1】:

获取主机和端口使用

InetSocketAddress remoteAddress = (InetSocketAddress)socket.getRemoteSocketAddress();
String host = remoteAddress.getHostName();
int port = remoteAddress.getPort();

您可以对来自套接字的输入流执行的主要操作是读取数据

如果你有字符串数据被传输,你可以很容易地使用 BufferedReader

BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
for(String line = reader.readLine(); line != null; line = reader.readLine())
    //do stuff

【讨论】:

  • 谢谢,但如果我使用 getRemoteSocketAddress();,我有设备的 IP 地址,它连接到我的服务器,但我想获取目标服务器的地址。
  • @VadimNovakovskiy 本地的 SocketAddress 是socket.getLocalSocketAddress();,有没有你要找的第三个地址?
  • 我有一个设备,可以调用任何网站。我的服务器捕获 TCP 数据包作为代理服务器,我想获取主机和端口,这些数据包去哪里
  • @VadimNovakovskiy 您是否尝试过打印通过套接字发送的所有内容?您是在定义自己的协议还是使用其他协议?
猜你喜欢
  • 1970-01-01
  • 2015-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多