tcp(Transmission Control Protocol)傳輸控制協議及案例檔案下載器
阿新 • • 發佈:2018-12-15
----------udp通訊模型
是寫信的模型
要填上ip 埠
特點:不太安全,容易丟包
飛q:edp
----------tcp通訊模型
是打電話的模型,不需要填寫ip和port
TCP:安全
在通訊開始之前,一定要建立相關的連結,才能傳送資料。
建立通道。
----------TCP通訊需要經過建立連線,資料傳送,終止連線三個步驟。
----------TCP採用了應答機制
-----------TCP和UDP的不同點
面向連線(確認有建立三方交握,連線已建立才作傳輸)
有序資料傳輸
重發丟失的資料包
捨棄重複的資料包
無差錯的的資料傳輸
阻塞/流量控制
----------udp流程
----------tcp流程
-----------tcp客戶端
-----------tcp客戶端構建流程
import socket def main(): # 建立套接字 tcp_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 連結伺服器 server_ip = input("請輸入要連結的伺服器的ip:") server_port = int(input("請輸入要連結的伺服器的port:")) server_addr = (server_ip,server_port) tcp_socket.connect(server_addr) # 傳送資料 while True: send_data = input("請輸入要傳送的資料:") tcp_socket.send(send_data.encode("utf-8")) if send_data == "exit": break # 關閉套接字 tcp_socket.close() if __name__ == "__main__": main()
-------------TCP伺服器
------------------TCP伺服器程式碼
import socket def main(): # 買個手機(建立套接字) tcp_server_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 安裝手機卡(繫結本地資訊) localaddr = ("",7788) tcp_server_socket.bind(localaddr) # 將手機設定為正常的 響鈴模式(讓預設的套接字由主動變為被動 listen) tcp_server_socket.listen(128) print("------1------") while True: # 等待別人的電話到來(等待客戶端的連結 accept) new_client_socket,client_addr = tcp_server_socket.accept() print("--------2--------") print(client_addr) # 接收客戶端傳送過來的請求 recv_data = new_client_socket.recv(1024) print(recv_data) # 回送一部分資料給客戶端 new_client_socket.send("1111".encode("utf-8")) # 關閉套接字 new_client_socket.close() tcp_server_socket.close() if __name__ == "__main__": main()
----------主要流程是:
總述: 一個客戶端傳送資料,一個伺服器端接收資料
1.先是伺服器端開啟流,
2.到accept堵塞,等客戶端解堵塞
3.再是客戶端利用connect連線伺服器端
4.接收客戶端傳送的資訊
5.回送一部分資料給客戶端以證明發送成功
6.關閉套接字(關閉連線)
迴圈為多個客戶端服務
在accept前面加while True:
while True:
# 等待別人的電話到來(等待客戶端的連結 accept)
new_client_socket,client_addr = tcp_server_socket.accept()
print("--------2--------")
print(client_addr)
# 接收客戶端傳送過來的請求
recv_data = new_client_socket.recv(1024)
print(recv_data)
# 回送一部分資料給客戶端
new_client_socket.send("1111".encode("utf-8"))
# 關閉套接字
new_client_socket.close()
tcp_server_socket.close()
TCP——案例:檔案下載器模型(抄作業模型)
什麼叫下載:
1.在本地建立一個檔案
2.然後收到一點資料,就寫進去
----------檔案下載器的客戶端
1.開啟套接字
2.繫結地址
3.連結伺服器端
4.獲取下載的檔名字
5.傳送資料(一個檔名)
6.接收資料
7.把接收的資料寫在檔案內
8.關閉套接字
import socket
def main():
# 開啟套接字
tcp_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 繫結地址
localaddr = ("",7788)
tcp_socket.bind(localaddr)
# 連結伺服器端
server_ip = input("請輸入要連結的伺服器的ip:")
server_port = int(input("請輸入要連結的伺服器的port:"))
server_addr = (server_ip, server_port)
tcp_socket.connect(server_addr)
# 獲取下載的檔名字
download_file_name = input("請輸入要下載的檔名字:")
# 傳送資料(一個檔名)
tcp_socket.send(download_file_name.encode("utf-8"))
# 接收資料
recv_data = tcp_socket.recv(1024*1024)
# 把接收的資料寫在檔案內
with open("[新]" + download_file_name, "wb") as f:
f.write(recv_data)
# 關閉套接字
tcp_socket.close()
if __name__ == "__main__":
main()
----------檔案下載器的伺服器端
import socket
def main():
# 建立套接字
tcp_server_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 繫結自身地址
localaddr = ("",5050)
tcp_server_socket.bind(localaddr)
# 換為接聽
tcp_server_socket.listen(128)
# 接受客戶端訪問
new_client_socket,client_addr = tcp_server_socket.accept()
print(client_addr)
# 接受資料
recv_data = new_client_socket.recv(1024*1024)
print(recv_data)
# 傳送資料
new_client_socket.send("dqwdq".encode("utf-8"))
# 關閉套接字
new_client_socket.close()
tcp_server_socket.close()
if __name__ == '__main__':
main()