Python可以';t与Minecraft服务器的子进程通信

Python可以';t与Minecraft服务器的子进程通信,python,subprocess,minecraft,Python,Subprocess,Minecraft,我正在尝试为Minecraft服务器编写一个处理程序/控制器。我的问题是,我似乎无法让写作和阅读正常工作。当客户端发出使用服务器类的方法serverCom的命令时,Minecraft服务器的文本/日志开始进入Python窗口/Python控制台,连接的客户端挂起。另外,在我使用Popen之后,Minecraft服务器似乎在我写入服务器之前不会真正启动(也就是serverCom方法)。如果有人想知道,Popen将转到一个批处理文件,该批处理文件将打开.jar文件。这是在Windows XP上 im

我正在尝试为Minecraft服务器编写一个处理程序/控制器。我的问题是,我似乎无法让写作和阅读正常工作。当客户端发出使用服务器类的方法
serverCom
的命令时,Minecraft服务器的文本/日志开始进入Python窗口/Python控制台,连接的客户端挂起。另外,在我使用
Popen
之后,Minecraft服务器似乎在我写入服务器之前不会真正启动(也就是
serverCom
方法)。如果有人想知道,
Popen
将转到一个批处理文件,该批处理文件将打开.jar文件。这是在Windows XP上

import subprocess
import os
import configobj
import socket
import threading
from time import sleep

config = configobj.ConfigObj("config.ini")
cHost = config["hostip"]
cPort = int(config["hostport"])
cBuffer = int(config["serverbuffer"])
cClients = int(config["numberofclients"])
cPassword = config["password"]

class server(object):
    def __init__(self):
        self.process = False
        self.folder = "C:\\servers\\minecraft-danny"
        self.max = configobj.ConfigObj("%s\\simpleserver.properties"%self.folder)["maxPlayers"]

    def serverStart(self):
        if not self.process:
            self.process = subprocess.Popen("java -Xmx1024m -Xms1024m -jar minecraft_server.jar nogui", cBuffer, None, subprocess.PIPE, subprocess.PIPE, subprocess.STDOUT, cwd = self.folder)
            return True
        return False

    def serverStop(self):
        if self.process:
            self.serverCom("stop")
            self.process = False
            return True
        return False

    def serverCom(self, text):
        if self.process:
            self.process.stdout.seek(2)
            self.process.stdin.write("%s\n"%text)
            self.process.stdin.flush()
            self.process.stdout.flush()
            return (str(self.process.stdout.readline()), True)
        return ("", False)

    def serverPlayers(self):
        if self.process:
            self.serverCom("list")
            x = self.serverCom(" ")[0].split(":")[3].replace("\n","").replace(" ","")
            if x == "":
                x = 0
            else:
                x = len(x.split(","))
            return (x, self.max)
        return (0,self.max)

serv = server()

def client(cnct, adr):
    global count
    try:
        dat = str(cnct.recv(cBuffer)).split(" ")
        ans = False
        if dat[0] == "start":
            print "Client %s:%s started the MC Server....."%(adr[0], adr[1])
            x = serv.serverStart()
            sleep(1)
            serv.serverCom(" ")
            serv.serverCom(" ")
            sleep(5)
            if x:
                ans = "Server is now online."
            else:
                ans = "Server is already online."
        elif dat[0] == "stop":
            print "Client %s:%s stopped the MC Server....."%(adr[0], adr[1])
            x = serv.serverStop()
            sleep(6)
            if x:
                ans = "Server is now offline."
            else:
                ans = "Server is already offline."
        elif dat[0] == "commun":
            print "Client %s:%s executed a command on the MC Server....."%(adr[0], adr[1])
            serv.serverCom(" ".join(dat[1:]))
            x = serv.serverCom(" ")
            if x[1]:
                ans = x[0]
            else:
                ans = "No return text, server is offline or not responding."
        elif dat[0] == "players":
            print "Client %s:%s recieved the player count from the MC Server....."%(adr[0], adr[1])
            pc = serv.serverPlayers()
            ans = "%s/%s"%(pc[0],pc[1])
        elif dat[0] == "help":
            print "Client %s:%s recieved the help list....."%(adr[0], adr[1])
            ans = "__________\nstart - Starts the server.\nstop - Stops the server.\ncommun <command> - Writes to server's console.\nplayers - Returns player count.\nhelp - Shows this help.\nclose - Closes client connections.\n__________"
        elif dat[0] == "close":
            pass
        else:
            ans = "Command '%s' is not valid."%dat[0]
        if ans:
            cnct.send("PASS")
            cnct.send("%s\n"%ans)
            threading.Thread(target = client, args = (cnct, adr,)).start()
        else:
            cnct.send("DICN")
            cnct.send("Connection to server closed.\n")
            cnct.close()
            print "Client %s:%s disconnected....."%(adr[0], adr[1])
            if count:
                count -= 1
    except:
        cnct.close()
        print "Client %s:%s disconnected..... "%(adr[0], adr[1])
        if count:
            count -= 1

print "-MC Server Control Server v0.0.1 BETA-"
print "Starting up server....."
print "Connecting to socket....."
count = 0
sck = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sck.bind((cHost, cPort))
sck.listen(5)
print "Connected and listening on %s:%s....."%(cHost, cPort)
print "Setting up client listener, allowing %s clients to connect at a time....."%cClients
while True:
    for x in range(cClients):
        (cnct, adr) = sck.accept()
        print "Client %s:%s connected....."%(adr[0], adr[1])
        cnct.send("Welcome to MineCraft Server Control.\n\nPlease enter server control password.\n")
        ps = str(cnct.recv(cBuffer))
        if count < cClients:
            if ps == cPassword:
                cnct.send("CRRT")
                cnct.send("%s was correct.\nIf you need help type 'help'."%ps)
                count += 1
                threading.Thread(target = client, args = (cnct, adr,)).start()
            else:
                cnct.send("WRNG")
                cnct.send("%s wasn't the correct password, please try again."%ps)
                cnct.close()
                print "Client %s:%s rejected....."%(adr[0], adr[1])
        else:
            cnct.send("WRNG")
            cnct.send("Too many clients connected to MineCraft Server Control")
            cnct.close()
            print "Client %s:%s rejected....."%(adr[0], adr[1])

sck.close()
导入子流程
导入操作系统
导入配置对象
导入套接字
导入线程
从时间上导入睡眠
config=configobj.configobj(“config.ini”)
cHost=config[“主机IP”]
cPort=int(配置[“主机端口”])
cBuffer=int(配置[“服务器缓冲区”])
cClients=int(配置[“numberofclients”])
cPassword=config[“密码”]
类服务器(对象):
定义初始化(自):
self.process=False
self.folder=“C:\\servers\\minecraft”
self.max=configobj.configobj(“%s\\simpleserver.properties”%self.folder)[“maxPlayers”]
def服务器启动(自):
如果不是自行处理:
self.process=subprocess.Popen(“java-Xmx1024m-Xms1024m-jar minecraft_server.jar nogui”,cBuffer,无,subprocess.PIPE,subprocess.PIPE,subprocess.STDOUT,cwd=self.folder)
返回真值
返回错误
def服务器停止(自):
如果是自助流程:
self.serverCom(“停止”)
self.process=False
返回真值
返回错误
def服务器COM(自身,文本):
如果是自助流程:
self.process.stdout.seek(2)
self.process.stdin.write(“%s\n”%text)
self.process.stdin.flush()文件
self.process.stdout.flush()文件
返回(str(self.process.stdout.readline()),True)
返回(“,False)
def服务器播放器(自身):
如果是自助流程:
self.serverCom(“列表”)
x=self.serverCom(“”[0]。拆分(“”:“”[3]。替换(“\n”,”)。替换(“,”)
如果x==“”:
x=0
其他:
x=len(x.split(“,”))
返回值(x,最大自我)
返回值(0,自身最大值)
serv=server()
def客户(cnct、adr):
全局计数
尝试:
dat=str(cnct.recv(cBuffer)).split(“”)
ans=错误
如果dat[0]=“开始”:
打印“客户端%s:%s已启动MC服务器…”%(adr[0],adr[1])
x=serv.serverStart()
睡眠(1)
serv.serverCom(“”)
serv.serverCom(“”)
睡眠(5)
如果x:
ans=“服务器现在已联机。”
其他:
ans=“服务器已联机。”
elif dat[0]=“停止”:
打印“客户端%s:%s已停止MC服务器…”%(adr[0],adr[1])
x=serv.serverStop()
睡眠(6)
如果x:
ans=“服务器现在处于脱机状态。”
其他:
ans=“服务器已脱机。”
elif dat[0]=“公共”:
打印“客户端%s:%s在MC服务器上执行了命令…”%(adr[0],adr[1])
serv.serverCom(“.join(dat[1:]))
x=serv.serverCom(“”)
如果x[1]:
ans=x[0]
其他:
ans=“无返回文本,服务器脱机或无响应。”
elif dat[0]=“玩家”:
打印“客户端%s:%s已从MC服务器收到玩家计数…”%(adr[0],adr[1])
pc=serv.serverPlayers()
ans=“%s/%s”%(pc[0],pc[1])
elif dat[0]=“帮助”:
打印“客户端%s:%s已收到帮助列表…”%(adr[0],adr[1])
ans=“\uuuuuuuuuuuuuuuuuuuuuu\n开始-启动服务器。\n停止-停止服务器。\n通信-写入服务器控制台。\n播放器-返回播放器计数。\n帮助-显示此帮助。\n关闭-关闭客户端连接。\n
elif dat[0]=“关闭”:
通过
其他:
ans=“命令'%s'无效。”%dat[0]
如果答案是:
cnct.发送(“通过”)
cnct.send(“%s\n”%ans)
threading.Thread(target=client,args=(cnct,adr,).start()
其他:
cnct.send(“DICN”)
cnct.send(“与服务器的连接已关闭。\n”)
cnct.close()
打印“客户端%s:%s已断开连接…”%(adr[0],adr[1])
如果计算:
计数-=1
除:
cnct.close()
打印“客户端%s:%s已断开连接…”%(adr[0],adr[1])
如果计算:
计数-=1
打印“-MC服务器控制服务器v0.0.1测试版”
打印“正在启动服务器…”
打印“连接到插座…”
计数=0
sck=socket.socket(socket.AF\u INET,socket.SOCK\u流)
sck.绑定((cHost,cPort))
听一听(5)
打印“已连接并正在侦听%s:%s…”%(cHost,cPort)
打印“设置客户端侦听器,允许%s客户端一次连接…”%c客户端
尽管如此:
对于范围内的x(C客户端):
(cnct,adr)=sck.accept()
打印“客户端%s:%s已连接…”%(adr[0],adr[1])
cnct.send(“欢迎使用MineCraft服务器控制。\n\n请输入服务器控制密码。\n”)
ps=str(cnct.recv(cBuffer))
如果计数