一、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!