При "ручном" прогоне плагина выходит ошибка -
>>> RESTART: C:\Users\andrew\Documents\Minecraft Python\py\plugins\JuicyRaspberryPie\mcpi\pycmdsvr.py
registering command: blk
registering command: hi
Traceback (most recent call last):
File "C:\Users\andrew\Documents\Minecraft Python\py\plugins\JuicyRaspberryPie\mcpi\pycmdsvr.py", line 84, in <module>
server = socketserver.TCPServer((HOST, PORT), MyTCPHandler)
File "C:\Users\andrew\AppData\Local\Programs\Python\Python36-32\lib\socketserver.py", line 453, in __init__
self.server_bind()
File "C:\Users\andrew\AppData\Local\Programs\Python\Python36-32\lib\socketserver.py", line 467, in server_bind
self.socket.bind(self.server_address)
OSError: [WinError 10048] Обычно разрешается только одно использование адреса сокета (протокол/сетевой адрес/порт)
Spigot выдаёт при этом ошибку -
[08:44:55 WARN]: java.net.ConnectException: Connection refused: connect
[08:44:55 WARN]: at java.net.DualStackPlainSocketImpl.connect0(Native Method)
[08:44:55 WARN]: at java.net.DualStackPlainSocketImpl.socketConnect(Unknown Source)
[08:44:55 WARN]: at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source)
[08:44:55 WARN]: at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source)
[08:44:55 WARN]: at java.net.AbstractPlainSocketImpl.connect(Unknown Source)
[08:44:55 WARN]: at java.net.PlainSocketImpl.connect(Unknown Source)
[08:44:55 WARN]: at java.net.SocksSocketImpl.connect(Unknown Source)
[08:44:55 WARN]: at java.net.Socket.connect(Unknown Source)
[08:44:55 WARN]: at java.net.Socket.connect(Unknown Source)
[08:44:55 WARN]: at java.net.Socket.<init>(Unknown Source)
[08:44:55 WARN]: at java.net.Socket.<init>(Unknown Source)
[08:44:55 WARN]: at org.wensheng.plugins.JuicyRaspberryPie.onCommand(JuicyRaspberryPie.java:153)
[08:44:55 WARN]: at org.bukkit.command.PluginCommand.execute(PluginCommand.java:44)
[08:44:55 WARN]: at org.bukkit.command.SimpleCommandMap.dispatch(SimpleCommandMap.java:141)
[08:44:55 WARN]: at org.bukkit.craftbukkit.v1_12_R1.CraftServer.dispatchCommand(CraftServer.java:649)
[08:44:55 WARN]: at net.minecraft.server.v1_12_R1.PlayerConnection.handleCommand(PlayerConnection.java:1397)
[08:44:55 WARN]: at net.minecraft.server.v1_12_R1.PlayerConnection.a(PlayerConnection.java:1232)
[08:44:55 WARN]: at net.minecraft.server.v1_12_R1.PacketPlayInChat.a(PacketPlayInChat.java:45)
[08:44:55 WARN]: at net.minecraft.server.v1_12_R1.PacketPlayInChat.a(PacketPlayInChat.java:1)
[08:44:55 WARN]: at net.minecraft.server.v1_12_R1.PlayerConnectionUtils$1.run(SourceFile:13)
[08:44:55 WARN]: at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
[08:44:55 WARN]: at java.util.concurrent.FutureTask.run(Unknown Source)
[08:44:55 WARN]: at net.minecraft.server.v1_12_R1.SystemUtils.a(SourceFile:46)
[08:44:55 WARN]: at net.minecraft.server.v1_12_R1.MinecraftServer.D(MinecraftServer.java:748)
[08:44:55 WARN]: at net.minecraft.server.v1_12_R1.DedicatedServer.D(DedicatedServer.java:406)
[08:44:55 WARN]: at net.minecraft.server.v1_12_R1.MinecraftServer.C(MinecraftServer.java:679)
[08:44:55 WARN]: at net.minecraft.server.v1_12_R1.MinecraftServer.run(MinecraftServer.java:577)
[08:44:55 WARN]: at java.lang.Thread.run(Unknown Source)
Файл на который ругается -
# wenshengwang at gmail dot com
# BSD License
"""This is a TCP server. It is started by the JuicyRaspberryPie plugin and
listen on localhost port 32123.
When it start, it scan the "pplugins" directory for any python files and try
to load them as modules, in these modules, it search for any functions whose
docstring starts with "_mcp" and register them as commands.
When the server receive a command, if it matches one in the registry, it will
be executed. If not, it will execute a dummy command.
"""
import os
import sys
import glob
import socketserver
import threading
import types
import importlib
plugin_dir = os.path.realpath(os.path.join(os.path.dirname(__file__), ".."))
sys.path.insert(0, plugin_dir)
from mcpi.minecraft import Minecraft
HOST = 'localhost'
# TODO: read port from config.yml
PORT = 4444
KEEP_RUNNING = True
def keep_running():
return KEEP_RUNNING
# command registry
mc_functions = {}
pp_files = glob.glob(os.path.join(plugin_dir, "pplugins", "*.py"))
# import all files and put minecraft function into the mc_functions dict
for pp_file in pp_files:
basename = os.path.basename(pp_file)
if basename != "__init__.py":
try:
module = importlib.import_module("pplugins." + basename[:-3])
for item in dir(module):
if isinstance(module.__dict__[item], types.FunctionType):
docs = module.__dict__[item].__doc__
if docs and docs.startswith("_mcp"):
print("registering command:", module.__dict__[item].__name__)
mc_functions[item] = module.__dict__[item]
except (NameError, ImportError) as e:
print(e)
def chat(msg="Whaaat?!"):
mc = Minecraft.create()
mc.postToChat(msg)
class MyTCPHandler(socketserver.BaseRequestHandler):
def handle(self):
global KEEP_RUNNING
self.data = self.request.recv(1024)
# firt 2 bytes are length info, from Java's writeUTF
args = self.data[2:].decode('utf-8').split()
cmd = args[0]
if cmd == "list":
s = "Available commands: %s" % ( " ".join(list(mc_functions.keys())))
self.request.sendall(s.encode('utf-8'))
threading.Thread(target=chat, args=(s,), kwargs={}).start()
return
if cmd == "help":
s = 'JuicyRaspberryPie: put your Python files in pplugins, then "/p cmd" to call your function, "/p list" to see list of commands'
self.request.sendall(s.encode('utf-8'))
threading.Thread(target=chat, args=(s,), kwargs={}).start()
return
if cmd == "BYE":
print("got shutdown request, signing off")
KEEP_RUNNING = False
return
threading.Thread(target=mc_functions.get(cmd, chat), args=tuple(args[1:]), kwargs={}).start()
self.request.sendall("ok".encode('utf-8'))
if __name__ == "__main__":
server = socketserver.TCPServer((HOST, PORT), MyTCPHandler)
def server_serve():
while keep_running():
server.handle_request()
threading.Thread(target=server_serve).start()