使用socketServer编写的服务端接收浏览器请求 为什么会执行两次

密封罐子 2017-06-27 10:15:19
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class MyTomcat {

public static void main(String[] args) throws IOException {
System.out.println("server start");

ServerSocket ss = new ServerSocket(8888);
while(true){
Socket s = ss.accept();
String ip = s.getInetAddress().getHostAddress();
new Thread(new Task(s)).start();
}
}
}

class Task implements Runnable{
private Socket s;

public Task(Socket s){
this.s = s;
}

@Override
public void run() {
String ip = s.getInetAddress().getHostAddress();
System.out.println(ip+"...connected");
//
PrintWriter out;
try {
InputStream in = s.getInputStream();
byte[] buf = new byte[1024];
int len = 0;
len = in.read(buf);
String msg = new String(buf, 0, len);
System.out.println(msg);

out = new PrintWriter(s.getOutputStream(),true);
out.println("HTTP/1.1 200 OK");
out.println("Content-Type: text/html;charset=ISO-8859-1");
out.println("");
out.println("<html><body><font color='red'>hello china</font></body></html>");
System.out.println("ssssss");
s.close();
} catch (IOException e) {
e.printStackTrace();
}
}

}
...全文
343 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
密封罐子 2017-06-29
  • 打赏
  • 举报
回复
多谢大神帮助。给分!
soton_dolphin 2017-06-27
  • 打赏
  • 举报
回复
你这么写,应该会产生无穷多个线程啊,是不是执行两次程序就歇菜了?
密封罐子 2017-06-27
  • 打赏
  • 举报
回复
代码如上 run中的代码执行了两次,为什么啊?
110成成 2017-06-27
  • 打赏
  • 举报
回复
其实这个是浏览器导致的,不知道你有没有去看下请求的数据。 127.0.0.1...connected 127.0.0.1...connected GET / HTTP/1.1 Host: 127.0.0.1:8888 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 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36 Accept-Encoding: gzip, deflate, sdch Accept-Language: zh-CN,zh;q=0.8 Cookie: csrftoken=ynjKNfUCisdHq5ou0zoL8wQ4CLtPa2bC; _ga=GA1.1.1036223549.1491903960 ssssss GET /favicon.ico HTTP/1.1 Host: 127.0.0.1:8888 Connection: keep-alive User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36 Accept: */* Referer: http://127.0.0.1:8888/ Accept-Encoding: gzip, deflate, sdch Accept-Language: zh-CN,zh;q=0.8 Cookie: csrftoken=ynjKNfUCisdHq5ou0zoL8wQ4CLtPa2bC; _ga=GA1.1.1036223549.1491903960 ssssss 注意看第二次,它的请求是GET /favicon.ico HTTP/1.1 这是浏览器秘密去请求的,这是浏览器自带的机制,会自动的向服务器发出这样的图片请求。以做搜藏。 所以你会收到多个请求,但是你在你的代码没有去过滤这种请求。
lyn584238910 2017-06-27
  • 打赏
  • 举报
回复
while(true){
Socket s = ss.accept();
String ip = s.getInetAddress().getHostAddress();
new Thread(new Task(s)).start();
}你把white去了试试
soton_dolphin 2017-06-27
  • 打赏
  • 举报
回复
有两个requests

密封罐子 2017-06-27
  • 打赏
  • 举报
回复
引用 2 楼 soton_dolphin 的回复:
你这么写,应该会产生无穷多个线程啊,是不是执行两次程序就歇菜了?
accept() 是阻塞式的。 你可以执行一下我的代码 run中的内容会执行两次

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧