一,简单使用
1 #server端 2 import socket 3 wa=socket.socket() 4 wa.bind(("127.0.0.1",9532)) #只能添加元组(id,端口),一般是8000之后 回流id为 5 #127.0.0.1(一般自己练习时就用这个) 6 wa.listen() 7 conn,addr=wa.accept() #conn addr 8 while True: 9 ret=conn.recv(1024).decode("utf-8") #设置可以接受的内容大小,一般是1024,如果 10 #不够可以整倍的增加 11 if ret=="bye": 12 conn.send(b"bye") 13 break 14 print(ret) 15 info = input("***") 16 conn.send(bytes(info,encoding="utf-8")) #发信息需要转化为bytes类型 17 18 conn.close() 19 wa.close()
1 #client端 2 import socket 3 wb=socket.socket() 4 wb.connect(("127.0.0.1",9532)) 5 while True: 6 info=input("---") 7 wb.send(bytes(info,encoding="utf-8")) 8 ret=wb.recv(1024).decode("utf-8") #此地方容易发生堵塞,因为有一个.recv(1024)表示对方就要发一条信息
9 if ret=="bye": 10 wb.send(b"bye") 11 break 12 print(ret) 13 14 wb.close()
二,长连接
在Python中,encode()
和decode()
是用于字符串编码和解码的方法,用于在字符串和字节之间进行转换。
encode()
方法将字符串编码为字节序列,编码后的结果是一个字节序列(bytes
类型)。decode()
方法将字节序列解码为字符串,解码后的结果是一个字符串(str
类型)。
三,服务器控制客户端
1 import subprocess #os.Popen模块也可以实现相似的功能 2 ret=subprocess.Popen("dir",shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE) 3 print("stdot:",ret.stdout.read().decode("gbk")) 4 print("stderr:",ret.stderr.read().decode("gbk")) #windows默认使用的是gbk
udp不需要listen,只能被动的接受信息
udp不会发生黏包,因为数据发送数据太大无法发送完时,就只会发送一半,会
四,黏包
产生原因
- 连续send两个小数据
- 两个recv,第一个recv特别小