问题描述
我正在使用Windows 10。
我在Java上有此服务器程序:
import java.io.*;
import java.net.*;
public class TCPServer {
public static final int TCP_SERVER_PORT = 6789; //mer eller mindre tilfeldig valg portnr.
public static void main(String args[]) throws Exception
{
String setningFraKlient;
String oversattSetning;
//Lytter på port TCP_SERVER_PORT:
System.out.println("Lytter paa TCP-port " + String.valueOf(TCP_SERVER_PORT) + " ...");
ServerSocket welcomeSocket = new ServerSocket(TCP_SERVER_PORT);
while(true) {
//Tjeneren venter,'henger' på accept(),på at klienten skal ta kontakt:
Socket connectionSocket = welcomeSocket.accept();
//Fortsetter,skriver ut IP-adressen til klienten:
System.out.println("Kontakt med: " + connectionSocket.getRemoteSocketAddress().toString());
//Kopler connectionsocket til InputStream:
InputStreamReader isr = new InputStreamReader(connectionSocket.getInputStream());
BufferedReader fraKlient = new BufferedReader(isr);
//Kopler OutputStream til connectionsocket:
DataOutputStream tilKlient = new DataOutputStream(connectionSocket.getOutputStream());
//Leser data fra klienten:
setningFraKlient = fraKlient.readLine();
System.out.println("Tekst fra klient: " + setningFraKlient);
//Oversetter til store bokstaver:
oversattSetning = setningFraKlient.toUpperCase() + '\n';
System.out.println("Gjør om til store bokstaver,returnerer:" + oversattSetning);
//Sender store bokstaver i retur:
tilKlient.writeBytes(oversattSetning);
}
}
}
还有Java上的此客户端程序:
import java.io.*;
import java.net.*;
public class TCPClient {
public static void main(String args[]) throws Exception
{
String sentence="";
String modifiedSentence="";
//Oppretter forbindelse mot localhost på port 6789:
Socket clientSocket = new Socket("localhost",TCPServer.TCP_SERVER_PORT);
DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream());
BufferedReader inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
//Spør bruker etter tekst:
System.out.print("Skriv inn tekst: ");
BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in));
sentence = inFromUser.readLine();
outToServer.writeBytes(sentence + '\n');
modifiedSentence = inFromServer.readLine();
//Skriv ut tekst som store bokstaver:
System.out.println("\nTekst som store bokstaver: ");
System.out.println(modifiedSentence);
//Lukk socket og avslutt:
clientSocket.close();
}
}
正如在服务器代码上看到的那样,我使用“ localhost”来测试程序,并使用端口号6789。
当我运行程序时,它可以按预期工作:
- 我首先运行服务器程序。
- 然后我运行客户端程序。
- 我写一些消息作为字符串。
- 我将所有字母都转换为大写的字符串取回来。
我启动WireShark并执行以下操作:
- 我单击“开始->选项”,然后在此处选择用于连接互联网的“ Wi-fi”。 “链路层头”是“以太网”。
- 然后我在Wireshark上看到了不同的数据包或即将到来的数据包(UDP,TCP,TLS等)
- 我在Ecplipse上启动Java程序,输入字符串,发送并接收大写版本,如下所示 如上所述。
- 然后我停止了Wireshark。
Wireshark中的过滤器行为空白,那里没有过滤器。 我可以看到Wireshark中有很多数据包。 但是,尽管我的应用程序正在使用该端口,但是我找不到使用端口号6789的任何数据包。 而且我找不到任何名称为Java的数据包。
简而言之,我找不到在Java应用程序上发送的数据包。怎么会这样我如何找到包裹?
另一件事是,尽管我删除了所有浏览器缓存,但并不是我访问的所有网站都可以在WireShark上看到。我访问了一个网站,但在WireShark上看不到它。我单击了该站点上指向Wikipedia的链接,但这也是不可见的。
但是随后我访问stackoverflow.com,它在WireShark上可见,我得到响应“ 301永久移动”。
解决方法
在Linux上,您需要在环回接口上捕获数据包。在Windows上,您必须安装Npcap并选择Npcap回送接口。 AFAIK Npcap随附于Wireshark安装程序。
不确定是否需要root用户(在Linux上)或Administrator(在Windows上)来捕获流量。