您的位置:

Python Socket 编程详解

一、Socket基础

Socket是计算机网络中的一种通信方式,它是计算机之间通信的一种约定或一种方式,通常由IP地址和端口号组成。我们可以基于Socket实现不同的协议和应用,例如HTTP协议(Web服务器和客户端)和SMTP协议(邮件传输代理和客户端)。

Python中的Socket是封装了BSD Socket的接口实现,提供了非常方便的网络通信接口。Socket可以用于创建服务器和客户端来进行网络通信,Python中的Socket模块提供了两种类型的Socket:Stream Socket(面向连接的Socket)和 Datagram Socket(无连接Socket)。

二、Socket类型介绍

1. Stream Socket

Stream Socket(流式Socket)是TCP/IP协议通信的基础,其提供了面向连接的Socket通信方式。使用Stream Socket通信时,需要在客户端和服务器之间建立连接,连接成功后,通信双方可以通过该连接无限制地传输数据。Stream Socket建立的连接是可靠的,传输的数据不会丢失。

# Stream Socket示例代码
import socket

server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 创建TCP Socket对象
server.bind(('127.0.0.1', 5000)) # 绑定IP地址和端口号
server.listen(5) # 开始监听连接,等待客户端连接
print('Server started and listen on port 5000...')

while True:
    client_socket, client_address = server.accept() # 接受客户端连接
    print('New client connected:', client_address)
    client_socket.send('Hello, welcome to the server!'.encode('utf-8'))
    client_socket.close() # 关闭连接

2. Datagram Socket

Datagram Socket(数据报式Socket)是UDP协议通信的基础,其提供了无连接的Socket通信方式。使用Datagram Socket通信时,不需要建立连接,直接向目标主机发送数据报,目标主机收到数据报后直接处理,不做应答。Datagram Socket建立的连接不是可靠的,传输的数据可能丢失。

# Datagram Socket示例代码
import socket

client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # 创建UDP Socket对象
server_address = ('127.0.0.1', 5000) # 设置服务器地址和端口号

message = 'Hello, server!'.encode('utf-8')
client.sendto(message, server_address) # 发送数据报到服务器
data, server_address = client.recvfrom(1024) # 接收服务器的响应数据
print('Received data from server:', data.decode('utf-8'))
client.close() # 关闭连接

三、Socket编程细节

1. IP地址和端口号

在Socket通信中,每个主机都有自己的IP地址,IP地址用于唯一标识一个主机。端口号用于标识一个进程,不同的进程需要使用不同的端口号。在通信之前,需要先确定通信双方的IP地址和端口号。

2. 服务器和客户端

在Socket通信中,服务器和客户端是两个需要进行通信的对象。服务器在启动之前需要先绑定自己的IP地址和端口号,然后等待客户端连接。客户端在发起连接之前需要确定服务器的IP地址和端口号。

3. 数据的发送和接收

在Socket通信中,数据的发送和接收都是通过Socket对象来进行的。发送数据时需要先将数据转换成二进制类型,然后调用Socket对象的send()方法将数据发送出去。接收数据时,调用Socket对象的recv()方法等待接收数据。在数据的传输过程中,需要注意发送和接收的顺序,否则会造成数据接收错误。

4. 多线程和多进程

在Socket编程中,服务器和客户端通常需要同时处理多个连接。为了提高程序的并发处理能力,我们可以使用多线程或多进程来处理不同的连接,以避免阻塞其他的连接。

四、Socket应用案例

1. HTTP服务器

使用Socket编写一个简单的HTTP服务器,在浏览器中输入服务器地址和端口号,可以获取服务器上的HTML页面。

# HTTP服务器示例代码
import socket

server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 创建TCP Socket对象
server.bind(('127.0.0.1', 80)) # 绑定IP地址和端口号
server.listen(5) # 开始监听连接,等待客户端连接
print('HTTP Server started and listen on port 80...')

while True:
    client_socket, client_address = server.accept() # 接受客户端连接
    print('New client connected:', client_address)
    data = client_socket.recv(1024) # 接收客户端数据
    print('Received data from client:', data.decode('utf-8'))

    # 构造HTTP响应报文
    response = "HTTP/1.1 200 OK\r\n"
    response += "Content-Type: text/html;charset=utf-8\r\n"
    response += "\r\n"
    response += "Hello, World!

Hello, World!