当我们需要在本机或者远程服务器上实现进程间通信,就需要使用到TCP(Transmission Control Protocol)套接字编程。在Python中,我们使用socket
库来实现TCP服务端和客户端。
如何创建TCP服务端
- 导入
socket
库模块
import socket
- 创建套接字
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
创建方式解释:
AF_INET
:使用IPv4协议;-
SOCK_STREAM
:使用TCP协议; -
绑定地址和端口
server_socket.bind(('127.0.0.1', 8888))
bind()
方法接收一个元组类型参数,元组中的第一个元素为IP地址,第二个元素为端口号。
- 开启监听
server_socket.listen(5)
listen()
方法的参数为最大连接数,一旦有超过设置的最大连接数的请求,其他连接会被拒绝。
- 接受客户端连接
client_socket, client_address = server_socket.accept()
accept()
方法返回两个参数:客户端套接字和客户端地址。
- 接收和发送数据
recv_data = client_socket.recv(1024).decode('utf-8')
client_socket.send('Hello, client!'.encode('utf-8'))
recv()
方法用于接收数据,参数为最大接收字节数;send()
方法用于发送数据,但需要将数据编码为bytes类型,在发送前需要使用encode()
方法进行编码,接收后需要使用decode()
方法进行解码。
- 关闭套接字
client_socket.close()
server_socket.close()
如何创建TCP客户端
- 导入
socket
库模块
import socket
- 创建套接字
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
创建方式解释:
AF_INET
:使用IPv4协议;-
SOCK_STREAM
:使用TCP协议; -
连接到服务端
client_socket.connect(('127.0.0.1', 8888))
connect()
方法接收一个元组类型参数,元组中的第一个元素为IP地址,第二个元素为端口号。
- 发送和接收数据
client_socket.send('Hello, server!'.encode('utf-8'))
recv_data = client_socket.recv(1024).decode('utf-8')
send()
方法用于发送数据,但需要将数据编码为bytes类型,在发送前需要使用encode()
方法进行编码,接收后需要使用decode()
方法进行解码;recv()
方法用于接收数据,参数为最大接收字节数。
- 关闭套接字
client_socket.close()
示例说明
这里提供两个示例来说明如何实现TCP服务端和客户端。
示例一:简单的TCP服务端和客户端交互
服务端代码:
import socket
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('127.0.0.1', 8888))
server_socket.listen(5)
print('Waiting for connection...')
client_socket, client_address = server_socket.accept()
print('Connected by', client_address)
while True:
recv_data = client_socket.recv(1024).decode('utf-8')
if not recv_data:
break
print('Received message: ', recv_data)
client_socket.send(f"Server: {recv_data}".encode('utf-8'))
client_socket.close()
server_socket.close()
客户端代码:
import socket
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect(('127.0.0.1', 8888))
while True:
message = input('Please input message: ')
if not message:
continue
client_socket.send(message.encode('utf-8'))
recv_data = client_socket.recv(1024).decode('utf-8')
print('Received message: ', recv_data)
client_socket.close()
在打开服务端和客户端的终端并分别运行服务端和客户端代码后,客户端控制台会不断提示输入消息,在输入消息后服务端将会直接对消息进行回显。
示例二:TCP服务端并发处理客户端请求
服务端代码:
import socket
import threading
def handle_client(client_socket, client_address):
while True:
recv_data = client_socket.recv(1024).decode('utf-8')
if not recv_data:
break
print(f'Received message from {client_address}: {recv_data}')
client_socket.send(f"Server: {recv_data}".encode('utf-8'))
client_socket.close()
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('127.0.0.1', 8888))
server_socket.listen(5)
while True:
print('Waiting for connection...')
client_socket, client_address = server_socket.accept()
client_thread = threading.Thread(target=handle_client, args=(client_socket, client_address))
client_thread.start()
server_socket.close()
客户端代码:
import socket
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect(('127.0.0.1', 8888))
while True:
message = input('Please input message: ')
if not message:
continue
client_socket.send(message.encode('utf-8'))
recv_data = client_socket.recv(1024).decode('utf-8')
print('Received message: ', recv_data)
client_socket.close()
在打开服务端和客户端的终端并分别运行服务端和客户端代码后,客户端控制台依然会不断提示输入消息,在输入消息后服务端将会打印出相应的信息,并且在多个客户端同时连接时,服务端也能够并发处理客户端请求。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python如何创建TCP服务端和客户端 - Python技术站