优快云话题挑战赛第2期
参赛话题:学习笔记
本文呢,是关于python/socket的一些常见错误的解决。
一、发送时没变为二进制
在python3之后,socket发送信息是需要把发送内容化为二进制的,
如果没有,则会报错:
import socket
Ip = "192.168.0.1"# 此处的IP地址是我乱输入的,正式使用时输入目标的IP
Sans = socket.socket(socket.AF_INEF,socket.SOCK_STREAM)
Sans.connect((Ip,12345))
Sans.send('hello\n'.encode())
#encode是把字符串化为二进制,
#decode是把二进制的字符串化为字符串
Sans.close()
二、无法连接或无法监听
这种情况一般是端口被占用,建议换一个端口;还有一种情况是没有权限。
三、缓冲区大小不够
一般是因为设置的缓冲区不够大,造成堵塞。
后果:只能接受一部分,另一部分会堵在端口,等待下一次接受,造成延迟。
解决方法:
# 客户端
import socket
Sans = socket.socket(socket.AF_INEF,socket.SOCK_STREAM)
Sans.connect(('192.168.0.1',12345))
A = 'jfishduhfsjdfuahhufhs……\n'# 假设传输了10KB内容
Num = len(A.encode())
Sans.send(str(Num).encode())# 发送缓冲区大小
Sans.send(A.encode())
Sans.close()
# 服务端
import socket
Sans = socket.socket(socket.AF_INEF,socket.SOCK_STREAM)
Sans.bind(('192.168.0.1',12345))
Sans.listen(5)
addr,sock = Sans.accept()
A = sock.recv(1024).decode()# 接受缓冲区大小
A = a.strip()# 去除特殊字符
A = int(A)
Info = sock.recv(A).decode()# 接受
sock.close()
Sans.close()
四、没加\n
这个问题我不确定,但是之前我没加\n出错了,加上就没事了。
·小结
文章诺有差错,请在下方评论告知,我会修改文章。
socket中还有很多问题没有解决,
我会尽快解决并发布。