Python 网络编程(Socket)
生活随笔
收集整理的這篇文章主要介紹了
Python 网络编程(Socket)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Python 網絡編程(Socket)
一、Socket 套接字
1、Socket 編程
- socket本質是編程接口(API),對TCP/IP的封裝,提供可供程序員做網絡開發所用的接口。Socket 編程是應用進程間通信的抽象機制。
- 應用編程接口API:應用進程的控制權和操作系統的控制權進行轉換的一個系統調用接口
- Socket 的意思為“插座”。是 BSD UNIX 的進程通信機制,通常也稱作"套接字",用于描述IP地址和端口,是一個通信鏈的句柄,可以用來實現不同虛擬機或不同計算機之間的通信。在Internet上的主機一般運行了多個服務軟件,同時提供幾種服務。每種服務都打開一個Socket,并綁定到一個端口上,不同的端口對應于不同的服務。Socket正如其英文原義那樣,像一個多孔插座。一臺主機猶如布滿各種插座的房間,每個插座有一個編號,提供不同的服務。 客戶軟件將插頭插到不同編號的插座,就可以得到相應的服務。
2、Socket
Socket 標識:
- 不同主機間 Socket 連接的標識:IP地址+端口號
- 操作系統/進程管理套接字的標識:套接字描述符(socket descriptor),小整數
Socket 創建:
- 當應用進程創建套接字時,操作系統分配一個數據結構存儲該套接字相關信息,返回套接字描述符
- 每個進程有一個 Socket 描述符表
- 如果多個進程共享一個套接字,關閉套接字時引用計數減1,減至0才關閉
- 如果進程中的一個線程將一個套接字關閉,該套接字直接關閉,該進程中的其他線程也將不能訪問該套接字
二、TCP
1、客戶端
訪問網站: HTTP 協議
# 導入socket庫 import socket# 創建一個socket,AF_INET 表示采用 IPv4 網絡協議,SOCK_STREAM 表示 TCP 連接 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 建立連接,需指明端口號,web 服務端口默認為 80 s.connect(('www.baidu.com', 80))# 發送數據 s.send(b'GET / HTTP/1.1\r\nHost:www.baidu.com\r\nConnection:close\r\n\r\n')# 接收數據 buffer = [] while True:# 每次最多接收1k字節d = s.recv(1024)if d:buffer.append(d)else:break data = b''.join(buffer)# 關閉連接 s.close()# 解析服務器響應數據 header, html = data.split(b'\r\n\r\n', 1) print(header.decode('utf-8')) # 把接收的數據寫入文件 with open('baidu.html', 'wb') as f:f.write(html)自定義連接:
# 導入socket庫 import socket# 創建一個socket s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 建立連接 s.connect(('127.0.0.1', 5000))# 接收歡迎消息 print(s.recv(1024).decode('utf-8')) for data in [b'Python', b'C++', b'AI']:# 發送數據s.send(data)# 接受數據print(s.recv(1024).decode('utf-8'))# 發送結束連接信號 s.send(b'exit')# 關閉連接 s.close()2、服務器
# 導入 socket 庫,threading 庫 import socket import threading import time# 處理請求函數 def tcp_link(sock, addr):print('Accept new connection from %s:%s...' % addr)sock.send(b'Welcome!')# 接收、發送數據while True:data = sock.recv(1024)time.sleep(1)if not data or data.decode('utf-8') == 'exit':breaksock.send(('Hello, %s!' % data.decode('utf-8')).encode('utf-8'))# 關閉連接sock.close()print('Connection from %s:%s closed.' % addr)# 創建一個socket s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 綁定端口 s.bind(('127.0.0.1', 5000))# 監聽端口,5表示最多同時監聽5個 s.listen(5) print('Waiting for connection...')# 等待連接,處理連接 while True:# 接受一個新連接sock, addr = s.accept()# 創建新線程來處理TCP連接t = threading.Thread(target=tcp_link, args=(sock, addr))t.start()三、UDP
1、客戶端
# 導入socket庫: import socket# 創建一個socket,SOCK_DGRAM 表示 UDP 連接 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)# 數據發送與接收 for data in [b'Python', b'C++', b'AI']:# 發送數據:s.sendto(data, ('127.0.0.1', 5000))# 接收數據:print(s.recv(1024).decode('utf-8'))# 關閉連接 s.close()2、服務器
# 導入socket庫: import socket import threading# 處理請求函數 def udp_link(data, addr):print('Received from %s:%s.' % addr)s.sendto(b'Hello, %s!' % data, addr)# 創建一個socket s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)# 綁定端口: s.bind(('127.0.0.1', 5000)) print('Bind UDP on 5000...')# 等待接收數據并處理 while True:# 接收數據:data, addr = s.recvfrom(1024)t = threading.Thread(target=udp_link, args=(data, addr))t.start()GOOD LUCK!
總結
以上是生活随笔為你收集整理的Python 网络编程(Socket)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何理解NIO
- 下一篇: Python-OpenCV 笔记9 --