用python實現一個機遇tcp協議的服務器和客戶端,服務器存儲文件,客戶端從服務器請求文件下載,互相通信。
1.tcp協議的服務器實現
from socket import *
import sys
def get_filecontent(file_name):
'''方法的作用是讀取文件內容給客戶端'''
try:
with open(file_name,'rb') as f:
content = f.read()
return content
except FileNotFoundError :
print("沒有找到文件%s"%file_name)
def main():
# 1.創建socket
tcp_socket = socket(AF_INET,SOCK_STREAM)
# 2.綁定服務器端口
address = ("",7788)
tcp_socket.bind(address)
#3.將主動套接字改成被動模式
tcp_socket.listen(128)
while True:
# 4.等待對方客戶端連接
client_socket ,client_addr = tcp_socket.accept()
# 5.接受對方客戶端的數據
recv_data = client_socket.recv(1000000) #這個表示單次連接傳輸文件大小,用戶根據實際自定
file_name = recv_data.decode("utf-8")
print("對方請求下載的文件名爲:%s"%file_name)
#調用上面的函數,實現讀取文件內容
file_content = get_filecontent(file_name)
print(file_content)
if file_content :
client_socket.send(file_content)
# 因爲獲取打開文件時是以rb方式打開,所以file_content中的數據已經是二進制的格式,因此不需要encode編碼
#關閉這個客戶端套接字
client_socket.close()
#關閉監聽套接字
tcp_socket.close()
if __name__ == '__main__':
main()
2.TCP實現客戶端
from socket import *
def main():
#1.創建客戶端套接字
tcp_client_socket =socket(AF_INET,SOCK_STREAM)
#2.與服務器建立連接
dest_server = ("127.0.0.1",7788)
tcp_client_socket.connect(dest_server)
# 3.數據發送,請求下載
send_Msg = input("請輸入需要下載的文件名稱:")
tcp_client_socket.send(send_Msg.encode("utf-8"))
#4.數據接收 ,寫入本地
recv_Msg = tcp_client_socket.recv(10000000000) #因爲這裏是接收文件,所以將單此傳輸文件大小要設置的大一些。
# print('接收到的數據爲:', recv_Msg.decode('utf-8'))
if recv_Msg:
with open('aaa_copy.txt',"wb") as f : #注意,這裏必須要是wb寫入模式,否則亂碼,因爲打開是rb模式。
f.write(recv_Msg)
print("下載成功,請查看!")
else :
print("沒有下載成功")
#5.關閉套接字
tcp_client_socket.close()
if __name__ == '__main__':
main()
3.通信實現客戶端從服務器端請求下載文件
1.先啓動服務器程序,
2.再啓動客戶端程序,輸入需要下載的文件名稱
D:\software\python3\python.exe D:/pythoyworkspace/d_demo.py
請輸入需要下載的文件名稱:aaa.txt
下載成功,請查看!
Process finished with exit code 0
對方請求下載的文件名爲:aaa.txt
3.最後在服務器當前目錄下查看文件,注意存放在服務器上的文件,必須要在程序的當前目錄下,不然找不到哈。