今天看到个关于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
第一次发文章,写的不好,不喜勿喷。希望对踩到同样坑的兄弟能有帮助。