python中HTTPServer不能响应客户端的断开连接请求

Archer_Jin 2017-04-01 11:44:37

from BaseHTTPServer import HTTPServer, BaseHTTPRequestHandler
class ACSServer(HTTPServer):
...
def start_ACS_server(ip_server, port_server, script, time_active):
server = ACSServer((ip_server, port_server), ACSRequestHandler)
tp = Thread(target = server.serve_forever)
tp.start()
time.sleep(time_active)
server.shutdown()

客户端:172.31.9.174
服务端:172.31.50.81
在客户端发送[FIN,ACK]后服务端为啥没响应断开连接的请求:
...全文
947 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
Archer_Jin 2017-04-05
  • 打赏
  • 举报
回复
在最后的时候会调用_send_204(),把_send_204()中多余的注释掉,把time.sleep(0.1)加上,然后就神奇地解决了

class ACSRequestHandler(BaseHTTPRequestHandler):
    def do_POST(self):
        self._send_204()
        # Waiting 0.1s is important, 
        # or self.request.shutdown(socket.SHUT_WR) will not work
        time.sleep(0.1)
        # when close_connection is 0, handle next request
        # if not, will not handle next request in the same stream
        self.close_connection = 1
    def _send_204(self):
        self.send_response(204, "No Content")
        # self.send_header("Server", "Apache-Coyote/1.1")
        '''
        Content-type is usually bind with Content-Length, 
        missing Content-Length will make socket can not close normally
        '''
        # self.send_header("Content-type", "text/xml")
        self.end_headers()
Archer_Jin 2017-04-04
  • 打赏
  • 举报
回复
写上下面代码也不发FIN,看了request的sockname和peername也的确是对应到我需要关闭的socket,要疯了

try:
    print self.request.getpeername()
    print self.request.getsockname()
    self.request.shutdown(socket.SHUT_RDWR)
except socket.error:
    print "socket.error"
    pass
self.request.close()
print("finish")
Archer_Jin 2017-04-04
  • 打赏
  • 举报
回复
引用 3 楼 ForestDB 的回复:
如果多等待会呢?
tp.start() time.sleep(time_active) server.shutdown() 多等待会server就被shutdown,不过我觉得你说的长连接的目的可能性挺大的。我先沿着这条线看看吧。
ForestDB 2017-04-01
  • 打赏
  • 举报
回复
如果多等待会呢?
Archer_Jin 2017-04-01
  • 打赏
  • 举报
回复
引用 1 楼 ForestDB 的回复:
可以在包上点右键,然后follow tcp stream,如果完整的流中确实没有服务器端的fin,那么有这么几种可能:1、你再等等;2、服务器为了长连接;3、有问题,看服务器的代码。
这已经是fllow tcp stream之后的包了,服务端重载了BaseHTTPRequestHandler

class ACSRequestHandler(BaseHTTPRequestHandler):
    def do_POST(self):
    ...
代码中并没有直接对socket进行编程,其他的规则都是沿用原来的库: from BaseHTTPServer import HTTPServer, BaseHTTPRequestHandler
ForestDB 2017-04-01
  • 打赏
  • 举报
回复
可以在包上点右键,然后follow tcp stream,如果完整的流中确实没有服务器端的fin,那么有这么几种可能:1、你再等等;2、服务器为了长连接;3、有问题,看服务器的代码。

37,720

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • IT.BOB
加入社区
  • 近7日
  • 近30日
  • 至今

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