Python是一種高級編程語言,具備力量強大的標準庫,包括一組關於socket通信的類和函數。Python socket通信提供了一種簡單而直接的交換數據方法,可以通過TCP或UDP創建一個連接並進行雙向通信。
一、Python TCP通信
TCP(Transmission Control Protocol)是一種高可靠性的面向連接的協議,被常用於Web服務器、Email、FTP服務器等。Python socket模塊提供了一組TCP通信相關的類和函數,同時也提供了一組示例代碼。
import socket
#監聽一個端口
def listen_port(port):
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('', port))
s.listen(1)
while True:
conn, addr = s.accept()
print('Connection address:', addr)
data = conn.recv(1024)
if not data:
break
conn.sendall(data)
conn.close()
listen_port(12345)
以上代碼實現了一個TCP服務器示例代碼,其中使用了socket.socket()創建了一個Socket對象,並調用bind()方法綁定到本地IP地址以及指定的端口號(12345)。使用listen()方法指定最大連接數,並使用accept()方法接受客戶端連接請求。recv()方法用於接收客戶端發送的數據,sendall()方法用於向客戶端發送數據,在數據傳輸完畢後,使用close()方法關閉連接。
二、Python多線程通信
在實際應用中,需要同時處理多個連接,這時就需要使用多線程或多進程技術。Python提供了threading模塊和socketserver模塊來支持多線程通信。
import socket, threading
#監聽一個端口
def listen_port(port):
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('', port))
s.listen(5)
while True:
conn, addr = s.accept()
print('Connection address:', addr)
t = threading.Thread(target=handle_client, args=(conn,))
t.start()
#線程處理函數
def handle_client(conn):
while True:
data = conn.recv(1024)
if not data:
break
conn.sendall(data)
conn.close()
listen_port(12345)
以上代碼實現了一個支持多線程的TCP服務器示例代碼,其中每個客戶端的連接請求被分別處理,將處理函數作為參數傳遞給新線程,並啟動線程。
三、Python與C通信
在某些場景下,需要使用Python作為編寫應用程序的用戶界面,而底層的功能需要使用C語言實現。可以使用Python的ctypes模塊和Socket通信來實現Python與C語言的通信。
下面是一個使用Python與C語言通信的實例。
#C語言代碼
#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <netinet/in.h>
#define PORT 8080
int main(int argc, char const *argv[]) {
int server_fd, new_socket;
struct sockaddr_in address;
int opt = 1;
int addrlen = sizeof(address);
char buffer[1024] = {0};
char *hello = "Hello from server";
// Creating socket file descriptor
if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {
perror("socket failed");
exit(EXIT_FAILURE);
}
// Attaching socket to the port 8080
if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT,
&opt, sizeof(opt))) {
perror("setsockopt");
exit(EXIT_FAILURE);
}
address.sin_family = AF_INET;
address.sin_addr.s_addr = INADDR_ANY;
address.sin_port = htons( PORT );
// Forcefully attaching socket to the port 8080
if (bind(server_fd, (struct sockaddr *)&address,
sizeof(address)) < 0) {
perror("bind failed");
exit(EXIT_FAILURE);
}
if (listen(server_fd, 3) < 0) {
perror("listen");
exit(EXIT_FAILURE);
}
if ((new_socket = accept(server_fd, (struct sockaddr *)&address,
(socklen_t*)&addrlen))<0) {
perror("accept");
exit(EXIT_FAILURE);
}
valread = read( new_socket , buffer, 1024);
printf("%s\n",buffer );
send(new_socket , hello , strlen(hello) , 0 );
printf("Hello message sent\n");
return 0;
}
#Python代碼
import ctypes
#載入C語言動態庫
lib = ctypes.CDLL('./libserver.so')
lib.go.argtypes = [ctypes.c_char_p]
lib.go.restype = None
#調用C函數
lib.go(b"Hello from Python")
以上代碼實現了一個從Python調用C動態庫的簡單示例程序,兩個程序通過Socket協議進行通信,在C語言中創建了一個Socket服務器,在Python中通過ctypes模塊調用C語言中的動態庫。
四、Python和Netty通信
Netty是一種基於Java的高性能異步事件驅動的網絡應用框架,支持多協議通信服務的開發。Python支持通過Socket協議與Netty進行通信。
#Python代碼
import socket
#連接到Netty服務器
server_address = ('localhost', 9090)
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(server_address)
#發送消息到Netty服務器
message = 'Hello from Python'
sock.sendall(message.encode())
#接收Netty服務器發送的消息
data = sock.recv(1024)
sock.close()
print(data.decode('utf-8'))
以上代碼實現了一個使用Python與Netty通信的示例程序,其中Python調用socket.socket()建立連接,並使用sendall()方法將消息發送給Netty服務器,最終調用recv()方法接收Netty發送的消息。
總結
通過以上的介紹,讀者可以了解到Python Socket通信的基本原理和應用場景,並掌握了基本的Socket通信技術。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/185684.html