socket(簡稱套接字) 是程序間通訊的一種方式,它與其他程序間通訊的乙個主要不同是:它能實現不同主機間的程序間通訊,socket屬於全雙工。
關於建立套接字的引數說明:
socket.socket(addressfamily, type)
address family:可以選擇 af_inet(用於 internet 程序間通訊) 或者 af_unix(用於同一臺機器程序間通訊),實際工作中常用af_inet
type:套接字型別,可以是 sock_stream(流式套接字,主要用於 tcp 協議)或者 sock_dgram(資料報套接字,主要用於 udp 協議)
tcp協議,傳輸控制協議(英語:transmission control protocol,縮寫為 tcp)是一種面向連線的、可靠的、基於位元組流的傳輸層通訊協議。tcp通訊需要經過建立連線、資料傳送、終止連線三個步驟。類似於日常生活中打**的場景,需要建立鏈結,確認傳送結果,安全傳輸。
tcp嚴格區分客戶端和服務端,服務端一般都需要繫結埠,否則客戶端找不到該伺服器,客戶端一般不繫結埠,如果客戶端繫結埠就會出現埠衝突導致無法多開的問題。
tcp相比udp有哪些優勢?(了解)
面向連線(確認有建立三方交握,連線已建立才作傳輸。);有序資料傳輸;重發丟失的資料報;捨棄重複的資料報;差錯的資料傳輸;阻塞/流量控制。
1.建立套接字
tcp_client_socket = socket.socket(socket.sock_af_inet, socket.sock_stream)
2.鏈結伺服器
tcp_client_socket.connect((『server_ip』, server_port))
3.向伺服器傳送資料
tcp_client_socket.send(『hello』.encode(『utf-8』))
4.接收伺服器回送資料
recv_data = tcp_cilent_socket.recv(1024) # 返回的是位元組型別的資料
5.關閉套接字
tcp_client_socket.close()
完整**:
import socket
def main():
# 建立套接字
tcp_socket = socket.socket(socket.af_inet, socket.sock_stream)
# 連線伺服器
dest_ip = input("輸入要連線的伺服器ip:")
dest_port = int(input("輸入要連線的伺服器port:"))
tcp_socket.connect((dest_ip, dest_port))
# 傳送資料
send_data = input("請輸入要傳送的資料:")
tcp_socket.send(send_data.encode("utf-8"))
# 接收資料
recv_data = tcp_socket.recv(1024)
print(recv_data.decode("utf-8"))
# 關閉套接字
tcp_socket.close()
if __name__ == '__main__':
main()
1.建立套接字
tcp_sever_socket = socket.socket(socket.af_inet, socket.sock_stream)
2.繫結埠資訊,一定要做
tcp_server_socket.bind((「」, 7788))
3.把監聽由主動變為被動
tcp_server_socket.listen(128)
4.等待客戶端鏈結,在鏈結之前處於堵塞狀態,一直到客戶端鏈結才會解堵塞
返回乙個新的套接字專為客戶端服務、以及客戶端的ip、port
new_client_socket, client_addr = tcp_server_socket.accept()
5.等待客戶端傳送資料
recv_data = new_client_socket.recv(1024).decode(『utf-8』)
6.可以給客戶端回送資料
new_client_socket.send(『hello』.encode(『utf-8』))
7.為該客戶端服務完畢之後關閉套接字
new_client_socket.close()
8.關閉伺服器端套接字
tcp_server_socket.close()
listen(backlog)中數值的含義:
監聽變主動為被動,backlog指定最多允許多少個客戶連線到伺服器。它的值至少為1。收到連線請求後,這些請求需要排隊,如果佇列滿,就拒絕請求。請注意,最大限制是取決於作業系統,ubuntu上預設是128
完整**:
import socket
def main():
tcp_socket = socket.socket(socket.af_inet, socket.sock_stream)
# 復用伺服器位址,解決連線伺服器時出現已使用問題
tcp_socket.setsockopt(socket.sol_socket, socket.so_reuseaddr, 1)
# 繫結伺服器位址
tcp_socket.bind(("", 9890))
# 監聽客戶端
tcp_socket.listen(128)
new_tcp_socket, new_addr = tcp_socket.accept()
send_msg = input("請輸入要給客戶端傳送的資料:")
new_tcp_socket.send(send_msg.encode("utf-8"))
recv_msg = new_tcp_socket.recv(1024)
print(recv_msg.decode("utf-8"))
new_tcp_socket.close()
tcp_socket.close()
if __name__ == '__main__':
main()
網路基本概念
網路 網路就是幾台計算機主機或者網路印表機之類的藉口裝置,通過網線或者無線網路技術將這些主機或者裝置連線起來,使得資料可以通過網路媒介來傳輸的一種方式 埠 網路聯機是雙向的,客戶端想連線到主機端,主機端必須啟動乙個埠進行監聽 主機端監聽 listen 主機所啟用的埠其實是某些網路服務所啟動的,如ww...
網路基本概念
網路基本概念 所謂計算機網路,就是把分布在不同地理區域的計算機與專門的外部裝置用通訊線路互聯成乙個規模大 功能強的網路系統。從而使更多的計算機可以方便的互相傳遞資訊,共享 硬體 軟體 資料資訊等資源。計算機網路是現代通訊技術與計算機技術相結合的產物。提供了資源共享 資訊傳輸與集中處理 均衡負荷與分布...
網路基本概念
get請求 在請求url後面以?的形式加上給伺服器的引數,多個引數之間用 隔開 由於瀏覽器和伺服器對url長度有限制,因此在url後面附帶的引數是有限制的,通常不能超過1kb post請求 發給伺服器的引數全部放在請求體中 理論上,post傳遞的資料量沒有限制 具體還得看伺服器的處理能 get和po...