Python學習筆記Day08 - 網路協議、socket
阿新 • • 發佈:2020-07-04
目錄
- 1.網路協議:http,smtp,dns,ftp,ssh, snmp, icmp, dhcp
- 2.socket:將send,receive封裝,協議直接呼叫即可
- 3.ip與port
- 4.粘包:連續send兩次,緩衝區會導致兩次資料粘在一起傳送(可以插入一次recv)
- 5.socket模擬
- 6.ftp模擬
- 7.socketserver:對socket的封裝,簡化
https://www.cnblogs.com/alex3714/articles/5227251.html
1.網路協議:http,smtp,dns,ftp,ssh, snmp, icmp, dhcp
本質上只做send,receive兩件事
2.socket:將send,receive封裝,協議直接呼叫即可
3.ip與port
4.粘包:連續send兩次,緩衝區會導致兩次資料粘在一起傳送(可以插入一次recv)
5.socket模擬
socket服務端
import socket import os server = socket.socket() # 1建立伺服器socket server.bind(('0.0.0.0', 9999)) # 2繫結埠 server.listen() # 3監聽 print('開始等電話') conn, addr = server.accept() # 4收到請求,建立新連線例項 print(conn, addr) print('收到電話') while True: data = conn.recv(1024) # 5接收資料,大小1024bites if not data: print('客戶端已斷開') break conn.send(data.upper()) print('返回其大寫') server.close()
socket客戶端
import socket client = socket.socket() #1宣告socket型別,同時生成socket連線物件 client.connect(('localhost',9999)) #2連線埠 while True: msg = input('>>:').strip() if len(msg) == 0:continue client.send(msg.encode()) #3傳送資訊 serverResponse = client.recv(1024) #4接收資訊 print('server response:',serverResponse.decode())
6.ftp模擬
ftp服務端
import socket
import hashlib
import os
server = socket.socket() # 建立伺服器
server.bind(('0.0.0.0', 9999)) # 繫結埠
server.listen() # 監聽
while True: # 多使用者
conn, addr = server.accept() # 收到請求,建立新連線
print('new coon:', addr)
while True: # 迴圈接收指令
print('等待新指令')
data = conn.recv(1024) # 接收資料,大小1024bites
if not data:
print('客戶端已斷開')
break
cmd, filename = data.decode().split()
print(filename)
if os.path.isfile(filename): # 確認檔案存在
with open(filename, 'rb') as f:
# m = hashlib.md5()
m = hashlib.md5(f.read())
f.seek(0)
fileSize = os.stat(filename).st_size
conn.send(str(fileSize).encode()) # 返回檔案總大小
conn.recv(1024) # 等待確認
print('正在傳送檔案')
sentSize = 0
for line in f:
# m.update(line)
conn.send(line)
sentSize += len(line)
print('已傳送', sentSize)
conn.send(m.hexdigest().encode())
print('檔案傳送完畢')
ftp客戶端
import socket
import hashlib
client = socket.socket()
client.connect(('localhost', 9999))
while True:
cmd = input('>>:').strip()
if len(cmd) == 0: continue
if cmd.startswith('get'):
client.send(cmd.encode())
serverResponse = client.recv(1024)
print('fileSize:', serverResponse)
client.send(b'ready to recv file')
fileSize = int(serverResponse.decode())
filename = cmd.split()[1]
suffix = filename.rsplit('.', 1)[1]
newFilename = '%s_new.%s' % (filename.rstrip('.%s' % suffix), suffix)
with open(newFilename, 'wb') as f:
recvSize = 0
m = hashlib.md5()
while recvSize < fileSize:
if fileSize - recvSize > 1024: # 不止一次
size = 1024
else:
size = fileSize - recvSize
data = client.recv(size)
recvSize += len(data)
m.update(data)
f.write(data)
else:
newMd5 = m.hexdigest()
print('檔案接收完畢:', recvSize)
print('new md5:',newMd5)
originMd5 = client.recv(1024).decode()
print('origin md5:',originMd5)
if newMd5 == originMd5:
print('檔案成功接收')
else:
print('檔案傳輸錯誤')
client.close()
7.socketserver:對socket的封裝,簡化
import socketserver
class MyTCPHandler(socketserver.BaseRequestHandler):
def handle(self):
while True:
try:
self.data = self.request.recv(1024).strip()
print(self.data)
except ConnectionResetError as e:
print('error:', e)
break
if __name__ == "__main__":
HOST, PORT = "localhost", 9999
# Create the server, binding to localhost on port 9999
server = socketserver.ThreadingTCPServer((HOST, PORT), MyTCPHandler)
server.serve_forever()