基於TCP客戶端和服務端的數據交換

基於TCP客戶端和服務端的數據交換

TCP套接字

TCP套接字是面向鏈接、基於流(stream)的套接字,數據收發無邊界。send調用後數據移動至輸出緩衝,recv調用瞬間,從輸入緩衝讀取數據。具備一下特性:python

  • I/O緩衝在建立socket時生成;
  • 各TCP socket的I/O緩衝獨立存在;
  • 關閉socket,輸出緩衝中的數據繼續傳輸,輸入緩衝中的數據將丟失。

具體實現

需求

使用TCP完成數據的上傳和下載服務器

(1) 準備:併發

文件夾中新建四個txt文件,1.txt、2.txt、3.txt、4.txtsocket

(2) 編寫TCP客戶端程序,code

① TCP的客戶端具備的功能:輸入 文件的名字,發送到服務器 實現文件的下載server

② 客戶端接收服務器端返回的數據進行判斷,若是是 標識: error,提示用戶文件不存在,不然將數據保存到本地ip

(3) 編寫服務端程序utf-8

① 接收客戶端的消息,根據客戶端發來的文件名,從桌面的info文件夾中讀取相應的文件內容返回給客戶端input

② 若是要下載的文件不存在,則返回 標識: errorit

客戶端
import socket

# 建立並鏈接
client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
client.connect(('localhost', 6060))

# 輸入併發送文件名
filename = input('Enter the file name you want to download:')
client.send(filename.encode('utf-8'))

# 接受判斷標識
recv_content = client.recv(1024).decode('utf-8')
if recv_content == 'error':
    print(f'there is no {filename}.')
elif recv_content == 'Ready to download':
    print(recv_content)
    # 使用循環從輸入緩衝中讀取並保存文件
    while True:
        recv_data = client.recv(1024)
        if recv_data:
            with open(filename,'ab') as f_obj:
                f_obj.write(recv_data)
        else:
            print('Down completely')
            break

client.close()
服務端
import socket

# 建立並接受鏈接
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR,True)
server.bind(('192.168.43.112', 6060))
server.listen(128)
client_service, client_ip_port = server.accept()
print(f'{client_ip_port} is connected')

# 接受文件名並按路徑打開
recv_data = client_service.recv(1024)
filename = recv_data.decode('utf-8')
dirc = "C:\\Users\\wz2310\\Desktop\\info\\"
try:
    f = open(dirc+filename,'rb')
except Exception as error:
    print(error)
    # 文件不存在返回錯誤
    client_service.send('error'.encode('utf-8'))
else:
    # 文件存在先返回提示再發送文件
    client_service.send('Ready to download'.encode('utf-8'))
    send_data = f.read()
    print(len(send_data))
    client_service.send(send_data)
    f.close()

client_service.close()
server.close()
相關文章
相關標籤/搜索