已经编写了一个测试服务器应用程序,它在特定端口上等待客户端(例如50000)。连接成功后,将启动处理特定连接的clienttask。在客户端数据包的开头有一个单词“options”之前,一切都按预期工作。例如,如果客户端发送以下数据:“options asdfasdf”,则数据包不会到达服务器应用程序,而且连接会被服务器中断。挖掘完这个问题后,我了解到问题是服务器端决定这是一个http数据包(http协议保留了命令“选项”),不明白为什么。
我有一个问题:哪个服务/驱动程序正在侦听我的专用端口,并确定这是一个某个http请求,并且由于http请求不是根据其标准执行的,而是根据我的专用标准执行的,因此它会停止连接?我只想读取我私有端口上的所有数据包,即使开头有“options”或“get”这样的词。我的测试服务器应用程序与http服务器或类似的东西无关。只有简单的客户机-服务器体系结构。
如果有意义的话,这个应用程序运行在一个带有静态公共ip的手机上。客户端-windows应用程序。wireshark显示,如果遇到保留的http命令之一,则重置数据包来自电话的ip。
服务器应用程序:
final ExecutorService clientProcessingPool = Executors.newFixedThreadPool(50);
Runnable serverTask = new Runnable() {
@Override
public void run() {
try {
ServerSocket serverSocket = new ServerSocket(50000);
System.out.println("Waiting for clients to connect...");
while (true) {
Socket clientSocket = serverSocket.accept();
clientProcessingPool.submit(new ClientTask(clientSocket));
}
} catch (IOException e) {
System.err.println("Unable to process client request");
e.printStackTrace();
}
}
};
Thread serverThread = new Thread(serverTask);
serverThread.start();
为了便于阅读,删除了所有不必要的数据
private class ClientTask implements Runnable {
private final Socket clientSocket;
private ClientTask(Socket clientSocket) {
this.clientSocket = clientSocket;
}
@Override
public void run() {
byte readBuffer[] = new byte[10001];
InputStream nis = null;
System.out.println("Got a client ! "+ this.clientSocket.getLocalSocketAddress()+" "+ this.clientSocket.getRemoteSocketAddress());
clientSocket.setReceiveBufferSize(10000);
nis = clientSocket.getInputStream();
while(true) {
int bytesReaded = nis.available();
if (bytesReaded > 0) {
bytesReaded = nis.read(readBuffer, 0, 10000);
System.out.println("data arrived " +bytesReaded+ " bytes");
}
}
}
}
暂无答案!
目前还没有任何答案,快来回答吧!