![](/img/trans.png)
[英]Sending files between client - server through TCP socket in python?
[英]Python 3: Sending files through socket. (Client-Server Program)
我有上述問題。 客戶端假設要求輸入文件名並將文件名發送到服務器,之后服務器將打開文件並顯示它。 問題是服務器沒有打開文件並顯示它。
以下是客戶。
#!/usr/bin/env python3
import socket, os.path, datetime, sys
def Main():
host = '127.0.0.1'
port = 50001
s = socket.socket()
s.connect((host, port))
Filename = input("Type in ur file ")
s.send(Filename.encode('utf-8'))
data = s.recv(1024).decode('utf-8')
s.close()
if __name__ == '__main__':
Main()
下面是服務器
#!/usr/bin/env python3
import socket
import os
import sys
def Main():
host = '127.0.0.1'
port = 50001
s = socket.socket()
s.bind((host,port))
print("server Started")
s.listen(1)
c, addr = s.accept()
print("Connection from: " + str(addr))
while True:
data = c.recv(1024).decode('utf-8')
myfile = open(data, "r")
if not data:
break
print("from connected user: " + myfile)
c.close()
if __name__ == '__main__':
Main()
我對運行的代碼進行了一些最小的調整,以便server.py
持續偵聽給定端口並發送每次調用client.py
請求的數據。
server.py
#!/usr/bin/env python3
import socket
import os
import sys
def Main():
host = '127.0.0.1'
port = 50001
s = socket.socket()
s.bind((host,port))
print("server Started")
s.listen(1)
while True:
c, addr = s.accept()
print("Connection from: " + str(addr))
filename = ''
while True:
data = c.recv(1024).decode('utf-8')
if not data:
break
filename += data
print("from connected user: " + filename)
myfile = open(filename, "rb")
c.send(myfile.read())
c.close()
if __name__ == '__main__':
Main()
client.py
#!/usr/bin/env python3
import socket, os.path, datetime, sys
def Main():
host = '127.0.0.1'
port = 50001
s = socket.socket()
s.connect((host, port))
Filename = input("Type in ur file ")
s.send(Filename.encode('utf-8'))
s.shutdown(socket.SHUT_WR)
data = s.recv(1024).decode('utf-8')
print(data)
s.close()
if __name__ == '__main__':
Main()
現在有點解釋。
在服務器端。 外部循環接受連接,然后從連接讀取直到完成(稍后將詳細介紹)。 打印您的調試信息,但請注意您嘗試print
文件對象而不是文件名(這將嘗試連接失敗)。 我也以二進制模式打開文件(這樣我可以跳過str
- > bytes
翻譯。
在客戶端。 我已經添加了在發送文件時關閉套接字的寫入端。 請注意,對於此用例,您可能希望使用sendall
而不是send
:請查看這些文檔鏈接以獲取詳細信息。 我已經為傳入的數據添加了一個print
。
現在關閉客戶端的寫入結束和內部循環讀取(也與sendall
提示相關。對於服務器端哪個BTW也適用,否則你應該循環,因為你可能會看到你的內容被截斷;其他選項也是一個發送循環。)。 流套接字將保證您將字節輸入以便發送它們。 它本身並不知道你的消息是否完整,也不能保證數據的發送和接收數量和數量(相應)。
服務器的內部循環繼續讀取,直到我們看到EOF
(我們在python socket
收到零長度字符串)。 這會發生(當遠程套接字(或至少它的寫入端)被關閉時由recv
返回。由於我們仍然想重用連接,我們只在客戶端的發送端執行此操作。希望這可以幫助您繼續前進
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.