1. 程式人生 > 實用技巧 >TCP-資料傳輸

TCP-資料傳輸

TCP 和 UDP

tcp: 面向連線的,雙方必須先建立連線,才能進行資料傳輸
迅雷採用tcp下載檔案
UDP: 當應用程式希望通過udp與一個應用程式通訊時,傳輸資料之前源端和終端不建立連線
1. tcp 面向連線;udp是無連線的,也就是傳送資料之前不需要建立連線。
2.tcp 提供可靠的服務,通過TCP連線傳送的資料,無差錯,不丟失,不重複,
且按序到達;udp 盡最大努力交付,即不保證可靠交付
3.udp 具有較好的實時性,工作效率不TCP高,適用於對高速傳輸和實時性有較高的通訊或廣播通訊
4. 每一條TCP只能是點到點的;udp支付一對一,一對多和多對一和多對多的互動通訊,
5.TCP對系統資源要求較多,udp對系統資源要求較少
6.全雙工:雙方都可以接受到資訊

簡單的例子:
import socket
def main():
# 1.建立socket
tcp_client = socket.socket(family=socket.AF_INET,type=socket.SOCK_STREAM)

# 2.連結伺服器
serve_ip = input("serve ip:")
serve_port = int(input("serve port:"))
tcp_client.connect((serve_ip,serve_port))

# 3.傳送資料
send_data = input("傳送的資料:")
tcp_client.send(send_data.encode())
# 4.接收服務端發來的資料 阻塞 等待伺服器傳送資料
recv_data = tcp_client.recv(1024) # 最大接收1024位元組
print(recv_data.decode('gbk')) # windows環境下 gbk

# 關閉套接字
tcp_client.close()
if __name__ == '__main__':
main()
"""
tcp 服務端
1.建立socket 買手機
2. bind繫結ip和port 插上手機卡
3.listen使套接字變為可以被動連線 允許別人打電話給你
4. accept等待客戶端的連線 等待別人打電話
5.recv/send 接收發送資料 聊聊天
"""
import socket
def main():

# 1.建立socket
tcp_server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 2. bind繫結ip和port
tcp_server.bind(('192.168.75.1',8080))

# 3.listen使套接字變為可以被動連線 別人可以連線伺服器
# bakclog = 1 這是代表著伺服器最大接收1個客戶端連線嗎? 不是
# bakclog 表示的是 伺服器 拒絕連線之前 作業系統可以掛起的最大連線資料
# 類似於排隊等待的數量
tcp_server.listen(1)


# 4. accept等待客戶端的連線 阻塞 等待客戶端連線 如果服務端與客戶端連線,則解阻塞
# tcp_server.accept()

new_client_socket,client_addr = tcp_server.accept()
# print(client_addr)

# 5. 接收資料
# 注意:之前連線的socket已經斷開了,現在使用的都是new_client_socket
recv_data = new_client_socket.recv(1024)
print(recv_data)

# 6.傳送資料
send_data = input("請輸入你傳送給client的資訊:")
new_client_socket.send(send_data.encode("gbk"))
if __name__ == '__main__':
main()
"""
實現TCP服務端為多個客戶端服務

迴圈

此程式需要注意的是:當一個客戶端的服務結束之後就會自動斷開,為
等待的一個客戶端服務,只能服務一次,無法多次為一個客戶服務
"""
import socket
def main():
tcp_serve = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
tcp_serve.bind(("192.168.75.1",7980))
while True:
tcp_serve.listen(128)

new_socket,client_addr = tcp_serve.accept()
print(client_addr)
"""
1. 允許多個客戶端 連線
2. 允許為客戶端多次服務
3. 但是 當前 只允許 為一個客戶端 進行多次服務(多執行緒)
"""
while True:
recv_data = new_socket.recv(1024)
print(recv_data.decode("gbk"))
"""
解阻塞
1. 客戶端傳送過來的資料,就會解阻塞
2.自動斷開連結 報錯
加以判斷
1. 有資料 則回覆訊息
2. 無資料 主動關閉連線(new_socket)跳出迴圈
"""
if recv_data.decode("gbk"):
send_data = "hello"
new_socket.send(send_data.encode("gbk"))
else:
break # 跳出迴圈
# 關閉連線
new_socket.close()
tcp_serve.close()

if __name__ == '__main__':
main()