如何在Java中解析来自套接字的TCP/IP数据包?

如何在Java中解析来自套接字的TCP/IP数据包?,java,sockets,parsing,packet,Java,Sockets,Parsing,Packet,我有来自socket的InputStreamInputStream sin=socket.getInputStream()。我想从这个套接字解析TCP/IP数据包,以获得目标主机和端口。 我该怎么做? 有什么建议吗 UPD 使用以下方法打印插座的所有内容时: bytes = sin.readAllBytes(); System.out.println("-> " + sin); System.out.println("-> -> " + sin.read()); for (in

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

UPD 使用以下方法打印插座的所有内容时:

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]);
}
这是我打印的字节数组的一部分

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

要获得主机和端口的使用

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

要获得主机和端口的使用

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

你说的“包”是什么意思?TCP/IP数据包?是的,当然。这些字节拼写为“�获取HTTP/1.1主机:2”。打印字母而不是数字可能更有用(只需将每个字节转换为字符),这样看起来不错。但我没有主机端口。请稍等,我将更新我的问题。它看起来需要“获取HTTP/1.1”和“主机:2ip.ru”。由于没有指定端口,如果您尝试使用默认http端口(80),会发生什么?您所说的“数据包”是什么意思?TCP/IP数据包?是的,当然。这些字节拼写为“�获取HTTP/1.1主机:2”。打印字母而不是数字可能更有用(只需将每个字节转换为字符),这样看起来不错。但我没有主机端口。请稍等,我将更新我的问题。它看起来需要“获取HTTP/1.1”和“主机:2ip.ru”。由于没有指定端口,如果您尝试使用默认的http端口(80)?Thx,但如果我使用getRemoteSocketAddress();,会发生什么;,我有连接到服务器的设备的IP地址,但我想获取目标服务器的地址。@vadimnovakovskii本地SocketAddress是
socket.getLocalSocketAddress(),你在找第三个地址吗?我有一个设备,可以呼叫任何网站。我的服务器作为代理服务器捕获TCP数据包,我想获取主机和端口,这些数据包在哪里go@VadimNovakovskiy你有没有试着打印出通过插座发送的所有信息?您是在定义自己的协议还是在使用其他协议?Thx,但如果我使用getRemoteSocketAddress();,我有连接到服务器的设备的IP地址,但我想获取目标服务器的地址。@vadimnovakovskii本地SocketAddress是
socket.getLocalSocketAddress(),你在找第三个地址吗?我有一个设备,可以呼叫任何网站。我的服务器作为代理服务器捕获TCP数据包,我想获取主机和端口,这些数据包在哪里go@VadimNovakovskiy你有没有试着打印出通过插座发送的所有信息?您是在定义自己的协议还是在使用其他协议?