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