简体   繁体   English

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

[英]How to parse TCP/IP packets from socket in Java?

I have InputStream from socket InputStream sin = socket.getInputStream(); 我有来自套接字InputStream sin = socket.getInputStream(); . I want to parse TCP/IP packets from this socket to get destination host and port. 我想从此套接字解析TCP / IP数据包以获取目标主机和端口。 How I can to do it? 我该怎么做? Any advice? 有什么建议吗?

UPD UPD

When printing out everything of the socket using: 当使用以下方法打印插座的所有内容时:

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]);
}

I have something like that: 我有这样的事情:

-> 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

It's a piece of a byte array that i print. 这是我打印的一个字节数组。

UPD2 UPD2

When i convert bytes to char i have this one: 当我将字节转换为char我有这个:

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

To get the host and port use 获取主机和端口使用

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

The main thing you can do with the input stream from a socket is read it for data 您可以对来自套接字的输入流进行的主要操作是读取数据

If you have String data being transmitted, you can use a BufferedReader pretty easily 如果您正在传输String数据,则可以很容易地使用BufferedReader

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM