关于python的socket服务端和客户端总是失去连接的问题

今天看到个关于netcat的文章,然后就找了下python手搓netcat的相关知识,所以就拐到了socket里,踩了一波坑,好在搞了半天终于解决了,记录一波,分享一下,希望对后面踩坑的有所帮助。

首先遇到的是这个报错:

ConnectionAbortedError: [WinError 10053] 你的主机中的软件中止了一个已建立的连接

百度了很久没收获,自己调试了半天,终于发现是这行的问题

server.close()

不论是客户端还是服务端的socket,只要调用到了这个close()方法,都会造成服务端报这个错误,不知道什么情况,如果想要服务端持续监听或者客户端持续发送,就不能调它。

然后就是服务端不能持续接收服务,我想要的效果是起了服务端的情况下,不论客户端任何时候发送信息,它都能响应。但是实际效果是,只要响应了一次,第二次再发一个信息,服务端就在accept()方法的时候卡死了,不动也不报错,扣了半天脑壳,感觉是accept阻塞的问题,然后百度移除阻塞,但是发现没这种操作。

最后解决后的效果虽然不是很完美,但是也能用。主要就是先设置socket超时,然后对accept方法做异常捕获,因为超时后accept()方法就会主动报错,这样就能往下走了。

最后服务端解决后的代码如下,希望有所帮助。

import socket

host='127.0.0.1'
port=4396

server=socket.socket(family=socket.AF_INET,type=socket.SOCK_STREAM)

server.bind((host,port))

server.listen()

server.settimeout(3) #设置超时时间,单位秒。这会出现最多3秒服务端发生响应

while True :
        
    try: #捕获accept的异常,当accept发生阻塞,配合那个3秒超时,强制它报错,这样才能继续往下走
        con,addr = server.accept()
    except Exception as e :
        print(e.__str__())
    try:#这里也要用捕获,否则容易出现上一个try异常了导致con没有被定义
        print('accept正在running')
        data = con.recv(4096)
        print('recv:%s' % str(data.decode()))
        message = "服务连接成功"
        con.send(data)
        print('发送了响应数据')
    except :
        pass

第一次发文章,写的不好,不喜勿喷。希望对踩到同样坑的兄弟能有帮助。

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值