socket

发布时间 2023-12-17 05:30:09作者: 我才是最帅的那个男人

一,简单使用

 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特别小