django 使用TCP连接(nginx+uwsgi部署),客户端偶尔接受不到消息

1.系统设计:
两台server,server A 用来做任务管理调度,开启一个socket server,监听12345端口
server B 是django web server,页面上控制 tcp client 发送协议命令到 server A管理任务

2.问题:
使用runserver 测试的时候tcp连接一直是正常的,但是生产上使用nginx uwsgi部署的时候发现,客户端(django server)有的时候发送命令过去,服务器端进程recv 接受不到,客户端报错timeout,但是从wireshark转包上可以看到,多发送几次就偶尔能成功

3.pcap
1)客户端发送

clipboard.png

2)服务器正常接受 返回

clipboard.png

4.代码
客户端:

def check_all_status(self):
    try:
        data={
            "cmd": "check_all_status"
        }
        CSysLog.info('before send')
        self.client.send(json.dumps(data).encode('utf-8'))
        CSysLog.info('before recv')
        ret = self.client.recv(self.BUFSIZ)
        CSysLog.info('receive data')
        print 'check  task status,ret', ret
        return json.loads(ret)
    except Exception,e:
        CSysLog.error('%s',str(e))
        return False
        

服务端:

while True:
    CSysLog.info('waiting for connection')
    tcpClientSock, addr = sock.accept()
    CSysLog.info('connect from %s', str(addr))
    while True:
        try:
            data = tcpClientSock.recv(BUFSIZ)
        except Exception, e:
            print(e)
            tcpClientSock.close()
            break
        if not data:
            break
            

异常的时候客户端send 之后就跳到异常了,time out

截图可以看到前两次客户端发送的同样的请求(93b)服务器端没有数据返回,有没有大神指点下是哪里的问题?再次强调,runserver 一直是好的。。。。有没有可能服务器这边会有TCP粘包?不太懂,谢了

阅读 6.6k
2 个回答
✓ 已被采纳新手上路,请多包涵

具体原因没找到,使用gunicorn部署后没有此问题了,

--应该根gunicorn uwsgi没关系,仔细看了下代码,前端有一处ajax的异步调用,会导致服务器连续发两条tcp的消息,这样应该时导致了socket server接收端有了tcp粘包(wiershark是抓不到的)。runserver 是好的估计是根服务器处理能力有关。。。
改成异步调用,或者修改协议添加长度头都可以解决此问题

你有没有考虑粘包问题。
TCP 曾并不是马上发送你的请求,而是自己控制的。所以有时候有的包是两个或多个一起发的。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题