📢 转载信息
原文链接:https://machinelearningmastery.com/building-a-simple-mcp-server-in-python/
原文作者:Jason Brownlee
在 Minecraft 中,Minecraft Coder Pack (MCP) 允许我们反编译、修改和重新编译 Minecraft 客户端和服务器。在构建自己的修改时,我们通常需要一个可以与修改后的客户端或服务器进行交互的工具或服务器。在这个教程中,我们将使用 Python 构建一个简单的 Minecraft 协议 (MCP) 服务器,它可以处理基本的连接和命令。
为什么要构建一个简单的 MCP 服务器?
当你在开发一个 Minecraft 客户端或服务器模组时,你可能希望创建一个可以测试你的连接和交互的独立程序。一个简单的 Python 服务器可以作为一个起点,为你提供一个可以发送命令并接收响应的机制。
先决条件
你需要安装 Python 3,并且不需要任何外部库。我们将仅使用 Python 标准库中的 socket 模块。
服务器实现
我们的目标是创建一个能够执行以下操作的服务器:
- 侦听传入的连接。
- 接受来自客户端的连接。
- 读取传入的命令。
- 发送一个简单的响应。
- 关闭连接。
我们将把代码分为几个部分,以使其易于理解。
1. 服务器设置
首先,我们需要定义服务器的地址和端口。对于本地测试,我们可以使用 localhost 和一个未被占用的端口,例如 25565(Minecraft 的默认端口)。
import socket
HOST = '127.0.0.1' # 标准环回地址
PORT = 25565 # 默认 Minecraft 端口
def start_server():
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.bind((HOST, PORT))
s.listen()
print(f"Server listening on {HOST}:{PORT}")
conn, addr = s.accept()
with conn:
print(f"Connected by {addr}")
handle_client(conn)
start_server()
这里的代码设置了一个标准的 TCP/IP 套接字,绑定到指定的 IP 地址和端口,然后进入侦听模式。s.accept() 会阻塞执行,直到有客户端连接进来,然后返回一个新的套接字对象 conn 用于与客户端通信,以及客户端的地址 addr。
2. 处理客户端连接
在 handle_client(conn) 函数中,我们将实现接收和响应逻辑。MCP 协议通常涉及字节流,但对于这个简单的示例,我们将假设客户端发送简单的文本消息。
我们首先需要读取数据,然后发送一个响应。
def handle_client(conn):
try:
while True:
# 读取数据 (假设最多接收 1024 字节)
data = conn.recv(1024)
if not data:
break
received_message = data.decode('utf-8').strip()
print(f"Received: {received_message}")
# 构建响应
response = "MCP Server received your message: " + received_message + "\n"
# 发送响应
conn.sendall(response.encode('utf-8'))
except Exception as e:
print(f"Error handling client: {e}")
finally:
print("Connection closed.")
这个处理函数会持续接收数据,直到客户端关闭连接(conn.recv() 返回空字节)。它将接收到的数据解码为 UTF-8 字符串,打印出来,然后发送一个简单的确认消息作为响应。
3. 完整代码
将所有部分组合在一起,得到一个可以运行的简单 MCP 服务器:
import socket
HOST = '127.0.0.1' # 标准环回地址
PORT = 25565 # 默认 Minecraft 端口
def handle_client(conn):
try:
while True:
# 读取数据 (假设最多接收 1024 字节)
data = conn.recv(1024)
if not data:
break
received_message = data.decode('utf-8').strip()
print(f"Received: {received_message}")
# 构建响应
response = "MCP Server received your message: " + received_message + "\n"
# 发送响应
conn.sendall(response.encode('utf-8'))
except Exception as e:
print(f"Error handling client: {e}")
finally:
print("Connection closed.")
def start_server():
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.bind((HOST, PORT))
s.listen()
print(f"Server listening on {HOST}:{PORT}")
while True:
conn, addr = s.accept()
with conn:
print(f"Connected by {addr}")
handle_client(conn)
if __name__ == "__main__":
start_server()
注意:我修改了 start_server() 函数,使其包含一个外部 while True 循环,这样服务器可以在处理完一个客户端后继续侦听新的连接,而不是在第一个客户端断开后就退出。
测试服务器
要测试这个服务器,你需要一个可以连接到 TCP 端口的客户端。如果你有一个 Minecraft 客户端或工具,你可以尝试连接到 localhost:25565。
或者,你可以使用 Python 编写一个非常简单的客户端来测试连接。
简单的客户端测试代码
import socket
HOST = '127.0.0.1'
PORT = 25565
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
try:
s.connect((HOST, PORT))
# 发送一个简单的命令或握手信息
message = "Handshake: ClientConnect\n"
s.sendall(message.encode('utf-8'))
print(f"Sent: {message.strip()}")
# 接收响应
data = s.recv(1024)
print(f"Received from server: {data.decode('utf-8').strip()}")
except ConnectionRefusedError:
print("Connection refused. Make sure the server is running.")
运行服务器代码,然后运行客户端代码。你应该会在服务器端看到连接信息和接收到的握手消息,并在客户端看到服务器的响应。
下一步
这个实现非常基础,因为它没有处理 Minecraft 协议的复杂性,例如变长数据包(VarInts)、身份验证或特定的协议版本。
要真正与 Minecraft 客户端通信,你需要:
- 实现读取和写入 VarInt 的逻辑。
- 在接收到特定协议状态(如
Status或Login)后,发送相应的协议握手和响应包。
这个简单的 TCP 服务器提供了一个坚实的基础,用于理解网络通信,这是开发任何网络协议交互的起点。
🚀 想要体验更好更全面的AI调用?
欢迎使用青云聚合API,约为官网价格的十分之一,支持300+全球最新模型,以及全球各种生图生视频模型,无需翻墙高速稳定,文档丰富,小白也可以简单操作。
评论区