tcp實現網路通訊
本章節使用socket套接字利用tcp在python環境下實現小檔案傳輸功能,後續將擴充套件tcp連結過程中的3次握手4次揮手。
tcp網路通訊中區分客戶端、伺服器,伺服器需繫結ip、port,客戶端
客戶端:
import socket
def main():
# 建立tcp套接字,socket.AF_INET ->對應ipv4命名規則;socket.SOCK_STREAM —>對應呼叫tcp套接字
socket_tcp = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 目的地址ip、port(注意ip地址資料型別為字串)
address = ('',8880)
# tcp套接字連結目的地址
socket_tcp.connect(address)
file_name = input('請輸入目標檔名')
# 向伺服器傳送請求檔名
socket_tcp.send(file_name.encode('utf-8'))
# 此處阻塞,等待接受伺服器返回的資料
message = socket_tcp.recv(1024)
# 若有返回資料,建立資料夾並寫入
if message:
with open('new_'+file_name,'wb') as files:
files.write(message)
#關閉tcp套接字
socket_tcp.close()
if __name__ == '__main__':
main()
伺服器:
import socket
def recv_send(new_socket):
# 此處阻塞,等待客戶端發來訊息
message = new_socket.recv(1024)
print(message)
files = None
try :
files = open(message,'rb')
except Exception as res:
print('無此檔案!')
if files:
new_socket.send(files.read())
def main():
# 建立tcp 套接字
socket_tcp = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# tcp先發起揮手的一方要等待對方最後發來的資料2到3分鐘左右佔用埠,這裡為方便除錯去掉等待。
socket_tcp.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
# 繫結本地ip、port地址
local_address = ('',8880)
socket_tcp.bind(local_address)
# 將tcp套接字調為被動接聽狀態
socket_tcp.listen(128)
while True:
# 此處阻塞,伺服器等待接聽客戶端接入
new_socket,source_address = socket_tcp.accept()
recv_send(new_socket)
# 關閉tcp套接字
# 關閉的同時預設向對方傳送空字元,代表關閉套接字
new_socket.close()
socket_tcp.close()
if __name__ == '__main__':
main()