协议:双方通信的方式就是协议
广播和单播(MAC地址):
开始要广播,拿着自己的IP和MAC,使用交换机,发送广播,找到对
方的MAC地址
拿着对方的MAC地址,使用单播的方式返回到自己的地址
黏包现象:
往文件写一个内容的时候,比如比较大的视频,当两个对端没有定义好大小的时候,会产生黏包现象
解决两种:
一种:time.sleep(0.1) #背后发生了什么
一种:
client:
import socket
import struct
import json
import os
import time
sk = socket.socket()
sk.connect(('127.0.0.1', 9003))
src = input('传入文件的地址:')
pathname = os.path.basename(src)
filesize = os.path.getsize(src)
dic = {'pathname': pathname, 'filesize': filesize}
ndic = json.dumps(dic)
ndic = ndic.encode('utf-8')
len_dic = len(ndic) #字典长度
# print(len_dic)
byte_dic = struct.pack('i', len_dic)
sk.send(byte_dic)
sk.send(ndic)
#E:\python课程\day29\视频\1.内容回顾和作业讲解.mp4
with open(src, 'rb') as f:
while 1:
data = f.read(1024)
if data:
sk.send(data)
else:
break
# while filesize > 1024:
# content = f.read(1024)
# filesize -= 1024
# sk.send(content)
# else:
# content = f.read()
# sk.send(content)
# time.sleep(1)
# sk.send(b'q')
sk.close()
server:
import socket
import struct
import json
sk = socket.socket()
sk.bind(('127.0.0.1', 9003))
sk.listen()
conn, addr = sk.accept()
msg = conn.recv(4)
msg = struct.unpack('i', msg)[0] #这是大小
#接这些数量大小的文件
str_dic = conn.recv(msg).decode('utf-8')
dic = json.loads(str_dic)
print(dic)
with open(dic['pathname'], 'wb') as f:
while 1:
content = conn.recv(1024)
if content:
f.write(content)
else:
break
# while True:
# content = conn.recv(1024)
# if content == b'q':
# break
# print(content)
# f.write(content)
conn.close()
sk.close()