Bootstrap

Python Socket 编程入门

***本文由AI辅助生成***

Python Socket 编程入门

Socket 编程是一种进程间通信的方式,允许跨网络的不同计算机之间进行数据交换。在Python中,socket库提供了低级别的网络接口,可用于TCP/IP或UDP协议的应用开发。

创建基本的TCP服务器端

以下是一个简单的Python TCP服务器示例:

import socket

HOST = 'localhost'
PORT = 65432  # Non-privileged ports are > 1023

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.bind((HOST, PORT))
    s.listen()
    conn, addr = s.accept()
    with conn:
        print(f'Connected by {addr}')
        while True:
            data = conn.recv(1024)
            if not data:
                break
            conn.sendall(data)
创建客户端

与上面的服务器配合使用的客户端:

import socket

HOST = 'localhost'  # The server's hostname or IP address
PORT = 65432         # The port used by the server

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.connect((HOST, PORT))
    s.sendall(b'Hello, world')
    data = s.recv(1024)

print('Received', repr(data))
UDP (User Datagram Protocol)

UDP 是一种无连接的服务,通常用于实时传输,如视频流和游戏。

UDP服务器

import socket

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
server_address = ('localhost', 10000)
sock.bind(server_address)

while True:
    data, address = sock.recvfrom(4096)
    print(f'Received {len(data)} bytes from {address}')
    if data:
        sent = sock.sendto(data, address)

UDP客户端

import socket

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

server_address = ('localhost', 10000)
message = b'this is the message'

sent = sock.sendto(message, server_address)
data, server = sock.recvfrom(4096)
使用 selectpoll 进行多路复用

Python 的 selectpoll 函数可用于监听多个socket,实现实时响应。

import select
import socket

inputs = [client_socket, server_socket]  # 假设 client_socket 已经建立连接
outputs = []

while inputs:
    readable, writable, exceptional = select.select(inputs, outputs, inputs)

    for s in readable:
        if s is server_socket:
            connection, client_address = s.accept()
            inputs.append(connection)
        else:
            data = s.recv(1024)
            if data:
                outputs.append(s)
            else:
                inputs.remove(s)

    for s in writable:
        s.sendall(data)
        outputs.remove(s)
        
    for s in exceptional:
        inputs.remove(s)
        if s in outputs:
            outputs.remove(s)

进一步学习

  • 考虑错误处理,如连接中断、缓冲区溢出等。
  • 学习更高级的并发模型,比如异步I/O和协程。
  • 探索安全性,如SSL/TLS加密。
  • 实践网络协议细节,了解HTTP、FTP等高级协议的工作原理。

Socket编程是网络应用的基础,掌握了它之后,你可以构建各种网络服务,从小型实验项目到大型分布式系统都可以涉及。

;