Основное краткое изложение ...
1) Мое приложение запускает процесс Java и управляет им.
2) У меня есть TCP-сервер в другом потоке, к которому пользователи могут подключаться ивыдавать команды, которые понимает процесс Java.
3) Передача команд не является проблемой streamWriter.WriteLine (cmd);но получение ответа оказывается трудным.
Следующая строка, которая приходит через RedirectStandardError (она использует его вместо Output по какой-то причине) должна быть ответом, но у меня возникают проблемы с выяснением, как получить доступэто в потоке моего TCP-сервера.
Вот как должна выглядеть функция моего TCP-сервера, чтобы получить ответ и распечатать его.Как я могу сделать это?
static void AcceptClient(IAsyncResult ar)
{
TcpListener rconListener = ar.AsyncState as TcpListener;
TcpClient rconClient = rconListener.EndAcceptTcpClient(ar);
Console.WriteLine("New client: " + rconClient.Client.RemoteEndPoint.ToString());
NetworkStream ns = rconClient.GetStream();
// Loop while client is Connected
while (rconClient.Connected)
{
byte[] buff = new byte[4096];
List<byte> msg = new List<byte>();
int total = 0;
while (true)
{
int read = ns.Read(buff, 0, buff.Length);
if (read <= 0)
break;
msg.AddRange(buff);
total += read;
if (read < buff.Length)
break;
}
if (msg.Count <= 0)
{
Console.WriteLine("Lost connection: " + rconClient.Client.RemoteEndPoint.ToString());
rconClient.Close();
break;
}
int len = BitConverter.ToInt32(msg.ToArray(), 0);
int seq = BitConverter.ToInt32(msg.ToArray(), 4);
PacketType packetType = (PacketType)BitConverter.ToInt32(msg.ToArray(), 8);
List<byte> response = new List<byte>();
// RCON Execute Command
if (packetType == PacketType.ServerData_ExecCommand_AuthResponse)
{
string srvcmd = ReadString(msg.ToArray(), 12);
Console.WriteLine("RCON: " + srvcmd);
response.AddRange(BitConverter.GetBytes((int)seq));
response.AddRange(BitConverter.GetBytes((int)PacketType.ServerData_ResponseValue));
string[] cmdargs = srvcmd.Split(new char[] { ' ' });
if (cmdargs[0] == "rcon_password")
{
ServerSettings.RCONPassword = cmdargs[1];
response.AddRange(Encoding.ASCII.GetBytes("RCON Password succesfully changed to " + cmdargs[1]));
}
else if (cmdargs[0] == "date")
{
response.AddRange(Encoding.ASCII.GetBytes(DateTime.Now.ToString()));
}
else
{
Program.SendRCONCmd(cmdargs[0]);
}
response.AddRange(new byte[] { 0x20, 0x0a }); //LF
response.Add(0x0);
response.Add(0x0);
response.InsertRange(0, BitConverter.GetBytes((response.Count)));
ns.Write(response.ToArray(), 0, response.Count);
}
}
}