Python Socket编程基础
1. 引入socket模块
在Python中,我们使用socket
模块来进行网络通信。首先,我们需要导入这个模块。
import socket
2. 创建socket对象
使用socket.socket()
函数来创建一个socket对象。这个函数接受两个参数:地址族和数据流类型。
- 地址族:
AF_INET
表示IPv4地址,AF_INET6
表示IPv6地址。 - 数据流类型:
SOCK_STREAM
表示TCP协议(面向连接的),SOCK_DGRAM
表示UDP协议(无连接的)。
# 创建一个TCP socket对象
tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
3. 绑定地址和端口
使用bind()
方法将socket绑定到一个地址和端口上。对于服务器来说,这是必须的,因为服务器需要监听一个特定的地址和端口来接收客户端的连接请求。
# 绑定到本地地址和端口
server_address = ('localhost', 12345)
tcp_socket.bind(server_address)
4. 监听连接
对于服务器socket,使用listen()
方法来开始监听连接。这个方法接受一个参数,表示最大连接数(通常设置为一个较大的值,如5)。
# 开始监听连接
tcp_socket.listen(5)
5. 接受连接
服务器使用accept()
方法来接受客户端的连接请求。这个方法会阻塞,直到有一个客户端连接上。当连接被接受后,accept()
方法返回一个包含两个元素的元组:一个新的socket对象(用于与客户端通信)和客户端的地址信息。
# 接受一个连接
client_socket, client_address = tcp_socket.accept()
print(f"Accepted connection from {client_address}")
6. 发送和接收数据
send()
方法用于发送数据。它接受一个字节串作为参数,并返回发送的字节数。注意,发送的数据必须是字节串,而不是字符串。你可以使用str.encode()
方法将字符串转换为字节串。recv()
方法用于接收数据。它也接受一个参数,表示最多接收的字节数。这个方法会阻塞,直到有数据到来或者连接被关闭。接收到的数据是一个字节串,你可以使用bytes.decode()
方法将其转换回字符串。
# 发送数据给客户端
message = "Hello, client!".encode()
client_socket.send(message)
# 接收客户端发送的数据
data = client_socket.recv(1024) # 最多接收1024字节
print(f"Received from client: {data.decode()}")
7. 关闭连接
使用close()
方法来关闭socket连接。无论是客户端还是服务器,在完成通信后都应该关闭socket连接。
# 关闭客户端socket
client_socket.close()
# 关闭服务器socket(在服务器处理完所有连接后)
tcp_socket.close()
完整示例:TCP服务器和客户端
TCP服务器
import socket
def start_tcp_server():
# 创建TCP socket对象
tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 绑定地址和端口
server_address = ('localhost', 12345)
tcp_socket.bind(server_address)
# 开始监听连接
tcp_socket.listen(5)
while True:
# 接受连接
client_socket, client_address = tcp_socket.accept()
print(f"Accepted connection from {client_address}")
try:
# 发送数据给客户端
message = "Hello, client!".encode()
client_socket.send(message)
# 接收客户端发送的数据
data = client_socket.recv(1024)
print(f"Received from client: {data.decode()}")
finally:
# 关闭客户端socket
client_socket.close()
if __name__ == '__main__':
start_tcp_server()
TCP客户端
```python
import socket
处理结果:
Python Socket编程基础
1. 引入socket模块
在Python中,我们使用socket
模块来进行网络通信。首先,我们需要导入这个模块。``python 使用
socket.socket()`函数来创建一个socket对象。这个函数接受两个参数:地址族和数据流类型。
- 地址族:
AF_INET
表示IPv4地址,AF_INET6
表示IPv6地址。python 使用`bind()`方法将socket绑定到一个地址和端口上。对于服务器来说,这是必须的,因为服务器需要监听一个特定的地址和端口来接收客户端的连接请求。
python
对于服务器socket,使用listen()
方法来开始监听连接。这个方法接受一个参数,表示最大连接数(通常设置为一个较大的值,如5)。python 服务器使用`accept()`方法来接受客户端的连接请求。这个方法会阻塞,直到有一个客户端连接上。当连接被接受后,`accept()`方法返回一个包含两个元素的元组:一个新的socket对象(用于与客户端通信)和客户端的地址信息。
python send()
方法用于发送数据。它接受一个字节串作为参数,并返回发送的字节数。注意,发送的数据必须是字节串,而不是字符串。你可以使用str.encode()
方法将字符串转换为字节串。
```python接收客户端发送的数据
使用close()
方法来关闭socket连接。无论是客户端还是服务器,在完成通信后都应该关闭socket连接。
```python关闭服务器socket(在服务器处理完所有连接后)
TCP服务器
```python
def start_tcpserver()创建TCP socket对象
tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)绑定地址和端口
server_address = ('localhost', 12345)
tcp_socket.bind(server_address)开始监听连接
tcpsocket.listen(5)
while True接受连接
client_socket, client_address = tcp_socket.accept()
print(f"Accepted connection from {clientaddress}")
try发送数据给客户端
message = "Hello, client!".encode()
client_socket.send(message)接收客户端发送的数据
data = clientsocket.recv(1024)
print(f"Received from client {data.decode()}")
finally_关闭客户端socket
clientsocket.close()
if name == 'main'
start_tcp_server()
```python