在用ServerSocket 写 http服务器,短连接已经实现了,没问题了。
就是在 while(true)循环里判断一下,如果read结果小于0就是http请求读取完了。用多个浏览器和postman和写代码测都没问题的。
但是实现长连接时,在上面的短连接的while(true)再加一层while(true),就相当于这个socket和其输入输出流除非异常了否则不关闭,
用几个浏览器和postman和写代码测,功能也是没问题的。
但问题是:只有postman和firefox和用java代码重复请求时,用的是同一个socket对象,其他的,比如360极速浏览器、QQ浏览器 、IE都是每
请求一次就 创建一个socket对象,我看这几个浏览器的Connection也都是keep-alive啊,请问这是怎么回事?
遇到的情况是因为浏览器的行为和你自己编写的代码的实现方式不同所致。
当你使用Postman或Firefox以及用相同的Java代码重复请求时,它们都可以维持长连接并重复使用同一个socket对象,因为它们默认都启用了HTTP keep-alive 功能。而其它一些浏览器(如IE、360极速浏览器、QQ浏览器)可能默认关闭了keep-alive 功能,或者在请求头中没有指定Connection: keep-alive。
为了确保实现长连接,你需要在HTTP响应中设置正确的头信息。以下是一个示例:
HTTP/1.1 200 OK
Connection: keep-alive
Keep-Alive: timeout=5, max=100
在上述示例中,将 Connection
头设置为keep-alive
,表示服务器允许长连接。Keep-Alive
头用于指定超时时间和最大请求数。这样,与支持keep-alive的客户端就可以重用同一个socket对象进行进一步的请求,以提高性能。
另外,你还可以考虑使用更现代的框架或库来实现HTTP服务器,例如Node.js的Express框架、Java的Spring框架或Python的Flask框架。这些框架通常会处理长连接和keep-alive的细节,简化了开发和维护。