1 """
2 socket套接字
3 """
4 1.127.0.0.1本机回环地址,
5 只能识别自己,其他人无法访问
6 2.send与recv对应,
7 不要出现两边都是相同的情况
8 3.recv是跟内存要数据,
9 至于数据的来源,你无需考虑
10 4.TCP特点:(自动优化机制)
11 会将数据量较小的并且时间间隔较短的数据,打包好,一次性发送给对方(造成粘包的原因之一)
12
13 重点*************
14 1.socket简单版本:
15 服务器:
16 import socket
17 # 1.买手机,创建一个对象
18 server = socket.socket()
19 # 2.插卡 ,绑定IP+port
20 server.bind(("127.0.0.1",8089))
21 # 3.监听电话
22 server.listen() # 参数为半连接数,为了保护传输路径
23 # 4.拨打电话 ,建立连接,获取连接地址和用户
24 client,addr = server.accpet()
25 # 5.通话,听,收
26 date = client.recv(1024)
27 date = date.decode('utf-8')
28 print(date)
29 # 6.通话,说,发
30 client.send(b'hello')
31 # 7.挂断电话
32 client.close()
33 # 8.关机
34 server.close()
35 客户端:
36 # 1.买手机,创建一个对象
37 client = socket.socket()
38 # 2.拨打电话
39 client.connect(("127.0.0.1",8089))
40 # 3.喂,说话,发
41 client.send(b'hhhaaa')
42 # 4.等别人回话
43 date = client.recv(1024)
44 date = date.decode('utf-8')
45 print(date)
46 # 5.挂电话
47 client.close()
48 2.socket解决粘包问题的最复杂版本
49
50 3.知识点补充:
51 socket server实现tcp允许多个用户连接
52 1)在这里先介绍一个点
53
54 有时候操作系统会运行的比较慢,造成你再用这个套接字的端口时,会刷新不过来
55 一般会在重启服务器时可能会遇到[Winerror 10048]通常套接字地址只允许使用一次
56 解决方案:
57 import socket
58 from socket import SOL_SOCKET,SO_REUSEADDR
59 sk = socket.socket()
60 sk.setsockopt(SOL_SOCKET,SO_REUSEADDR,1)
61 #在bind前面加这句话
62 sk.bind(('127.0.0.1',8090))
63 sk.linsten()
64
65 4.解决粘包问题
66 服务器:
67 1,先制造一个发送给客户端的字典
68 2,制作字典的报头
69 3,发送字典的包头
70 4,发送字典
71 5,在发送真实数据
72 客户端:
73 1.先接收字典的报头
74 2.解析拿到字典的数据长度
75 3.接收字典
76 4.从字典中获取正式数据的长度
77 5.接收真实数据
78 5.作业:
79 写一个上传电影的功能
80 1.循环打印某一个文件夹下面的所有的文件
81 2.用户选取想要上传的文件
82 3.将用户选择的文件上传到服务端
83 4.服务端保存该文件