Java中重复接受同一套接字连接请求

Java中重复接受同一套接字连接请求,java,android,http,Java,Android,Http,我正在Android 6.1平台上使用JavaServerSocket实现一个简单的http服务器。通过调用ServerSocket.accept(),线程将阻塞,直到收到请求 问题是,我总是看到相同http请求的重复接受,最终只有其中一个可以获得请求的内容。有什么想法吗 Android 6.1平台上使用Java ServerSocket的简单http服务器 while(mServerSocket!=null&&!mServerSocket.isClosed()){ 试一试{ Log.i(标记“

我正在Android 6.1平台上使用Java
ServerSocket
实现一个简单的http服务器。通过调用
ServerSocket.accept()
,线程将阻塞,直到收到请求

问题是,我总是看到相同http请求的重复接受,最终只有其中一个可以获得请求的内容。有什么想法吗

Android 6.1平台上使用Java ServerSocket的简单http服务器

while(mServerSocket!=null&&!mServerSocket.isClosed()){
试一试{
Log.i(标记“{\”msgid\”:\“RunningServer\”,“msg\”:\“LogHttpServer开始在“+mServerSocket.getInetAddress().getHostAddress()+”:“+mServerSocket.getLocalPort()+”\”)上侦听);
Socket clientSocket=mServerSocket.accept();
线程clientRequest=新工作线程(clientSocket,appContext);
clientRequest.start();
}捕获(例外e){
...
}
}
类WorkThread扩展线程{
@凌驾
公开募捐{
Log.i(标记“{\”msgid\”:\“ReceivingData\”,“msg\”:\“LogHttpServer接受了来自“+socket.getInetAddress().getHostAddress()+”\”}”的连接);
processHttpRequest(this.socket);
私有void processHttpRequest(套接字){
BufferedReader in=null;
OutputStream out=null;
if(this.socket.isConnected()){
试一试{
in=new BufferedReader(新的InputStreamReader(socket.getInputStream(),StandardCharsets.UTF_8));
}捕获(IOE异常){
Log.e(标记“{\”msgid\”:\“IOException\”,“\”msg\”:\“无法获取输入流,+e.toString()+“\”}”);
}
试一试{
out=socket.getOutputStream();
}捕获(IOE异常){
Log.e(标记“{\”msgid\”:\“IOException\”,“\”msg\”:\“无法获取输入流,+e.toString()+“\”}”);
}
int lineNum=0;
字符串方法=null;
字符串请求=null;
while(true){
弦线;
试一试{
如果(in==null | | |(line=in.readLine())==null | | line.length()==0)中断;
lineNum++;
Log.i(标记“{\”msgid\”:“HttpRequest\”,“msg\”:\“+line+”\”});
line=line.trim();
如果(lineNum==1){
StringTokenizer tokenized=新的StringTokenizer(行);
method=tokenized.hasMoreTokens()?tokenized.nextToken().toUpperCase():null;
request=tokenized.hasMoreTokens()?tokenized.nextToken().toLowerCase():null;
}
}捕获(IOE异常){
Log.e(标记“{\'msgid\”:\“IOException\”,\“msg\”:\“无法在流中读取\“}”);
}捕获(例外e){
Log.e(标记“{\'msgid\”:\“Exception\”,\“msg\”:\“+e.toString()+”\”);
返回;
}
}
...
}
}
生成的日志如下所示:

2019-06-14T10:34:52.635Z  3149  3209 I LogHttpServer: {"msgid":"RunningServer","msg":"LogHttpServer starts to listen at :::33284"}
2019-06-14T10:34:52.636Z  3149  3209 I LogHttpServer: {"msgid":"RunningServer","msg":"LogHttpServer starts to listen at :::33284"}
2019-06-14T10:34:52.636Z  3149  4409 I LogHttpServer: {"msgid":"ReceivingData","msg":"LogHttpServer accepted connection from 192.168.43.254"}

--> this is where I don't expect: duplicate acceptance with separate thread created.
2019-06-14T10:34:52.636Z  3149  4410 I LogHttpServer: {"msgid":"ReceivingData","msg":"LogHttpServer accepted connection from 192.168.43.254"} 

2019-06-14T10:34:52.642Z  3149  4409 I LogHttpServer: {"msgid":"HttpRequest","Method":"GET", "Request":"/cgi-bin/logs.sh"}

--> later, it actually not able to parse the contents
2019-06-14T10:35:03.216Z  3149  4410 E LogHttpServer: {"msgid":"InvalidHttpRequest","msg":"null Method or Request. Return."}

这里没有证据表明接受了两次相同的连接,更不用说相同的请求了。如果您记录了远程端口和远程地址,您就会看到。这里根本没有记录最后两条消息的代码。感谢您的回复。我使用嗅探器检查发送到空中的http请求,实际上只看到了一条。在日志中,生成了两个线程(4409和4410)来处理传入的请求。我认为这很明显?另一方面,我没有把所有的代码都放进去。我会的。但基本上,这是对http请求的解析,通过检查线程ID,我们可以看到4409被正确解析,4410有空的“方法”或“请求”字段。这一点也不明显。由于您声称的是不可能的,您需要努力提供可信的证据。您需要发布一个日志,显示远程IP地址和端口是相等的,正如我两天前所说的。而且您不可能从同一个套接字读取相同的数据两次:第二个是quest没有解析证明它与第一个不同。而
这个套接字在哪里以及如何定义?你需要提供完整的代码,足以让其他人执行它。这里没有证据表明接受相同的连接两次,更不用说相同的请求了。如果你记录了远程端口和远程地址,你可以我会看到的。这里根本没有记录最后两条消息的代码。感谢您的回复。我使用嗅探器检查发送到空中的http请求,实际上只看到一条。在日志中,有两个线程(4409和4410)是用来处理传入的请求的。我认为这很明显?另一方面,我没有把所有的代码都放进去。我会的。但基本上,这是对http请求的解析,通过检查线程ID,我们可以看到4409被正确解析,4410有空的“方法”或“请求”字段。这一点也不明显。由于您声称的是不可能的,您需要努力提供可信的证据。您需要发布一个日志,显示远程IP地址和端口是相等的,正如我两天前所说的。而且您不可能从同一个套接字读取相同的数据两次:第二个是quest没有解析证明它与第一个不同。这个套接字在哪里以及如何定义?您需要提供完整的代码,足以让其他人执行它。