我正在创建一个在后台运行Java服务器的应用程序,并使用每个新行输出到控制台列表框。但是,我希望能够创建一个计时器,例如不断读取控制台列表框中的某些预先确定的事情,但不是特定的。
例如,如果服务器输出“[17:32:50 INFO]:Matt [127.0.0.1]使用实体ID 233登录([world]坐标世界)”并将其添加到控制台列表框作为项目,我希望能够抓住“马特”部分并将其添加到当前在玩家列表框中在线的玩家列表中。 “实体ID”和“世界中的坐标”每次都会有所不同,因此无法确定。
除此之外我还想做同样的事情,当玩家断开连接时,控制台列表框会添加一个会说“马特离开游戏”的项目,我需要它能够搜索玩家列表框“Matt”并删除该项目。
我想知道这是否可能,如果不是很清楚,请道歉!
答案 0 :(得分:1)
foreach (var listBoxItem in listBox1.Items)
{
// use the currently iterated list box item
if (listBoxItem.ToString().Contains("logged"))
{
// Do your stuff here
}
}
答案 1 :(得分:1)
修改强>
如果你想获得玩家的名字,然后在"在线玩家"中添加或删除它。列表框,您可以使用Substring()
在从x index开始的字符串中搜索并选择y长度。
以下是适用于新格式的更新版本:
private void cmdLogin_Click(object sender, EventArgs e)
{
// Add example logins
lstConsoleOutput.Items.Add("[17:32:50 INFO]: Amy[/127.0.0.1:12345]logged in with entity ID 233 at ([world]co-ordinates in world)");
lstConsoleOutput.Items.Add("[18:42:51 INFO]: Dan[/255.255.255.255:23451]logged in with entity ID 233 at ([world]co-ordinates in world)");
lstConsoleOutput.Items.Add("[19:33:27 INFO]: Matt[/1.1.1.1:34512]logged in with entity ID 233 at ([world]co-ordinates in world)");
lstConsoleOutput.Items.Add("[02:17:03 INFO]: Some Really Long Screen Name[/292.192.92.2:45123]logged in with entity ID 233 at ([world]co-ordinates in world)");
lstConsoleOutput.Items.Add("[09:05:55 INFO]: ABC $!@#$ 12341234[/127.0.0.1:51234]logged in with entity ID 233 at ([world]co-ordinates in world)");
AnalyzeConsoleOutput(lstConsoleOutput, lstOnlinePlayers);
}
private void cmdLogout_Click(object sender, EventArgs e)
{
// Add example logouts
lstConsoleOutput.Items.Add("[22:12:12 INFO]: Amy left the game");
lstConsoleOutput.Items.Add("[23:44:15 INFO]: Matt left the game");
lstConsoleOutput.Items.Add("[24:00:00 INFO]: ABC $!@#$ 12341234 left the game");
AnalyzeConsoleOutput(lstConsoleOutput, lstOnlinePlayers);
}
private void AnalyzeConsoleOutput(ListBox listboxToAnalyze, ListBox onlinePlayersListbox)
{
const string LoginIdentifier = "]logged in with entity";
const string LogoutIdentifer = " left the game";
string playerName;
foreach (var item in listboxToAnalyze.Items)
{
// Check if a player has logged in and add them to the players list box
if (item.ToString().Contains(LoginIdentifier))
{
int startOfPlayerNameIndex = item.ToString().IndexOf("]: ") + 3;
int lengthOfPlayerName = item.ToString().IndexOf('[', item.ToString().IndexOf('[') + 1) - startOfPlayerNameIndex;
playerName = item.ToString().Substring(startOfPlayerNameIndex, lengthOfPlayerName);
if (!onlinePlayersListbox.Items.Contains(playerName))
{
onlinePlayersListbox.Items.Add(playerName);
}
}
// Check if a player has logged out and remove them from the players list box
if (item.ToString().Contains(LogoutIdentifer))
{
int startOfPlayerNameIndex = item.ToString().IndexOf("]: ") + 3;
int lengthOfPlayerName = item.ToString().IndexOf(LogoutIdentifer, 0) - startOfPlayerNameIndex;
playerName = item.ToString().Substring(startOfPlayerNameIndex, lengthOfPlayerName);
if (onlinePlayersListbox.Items.Contains(playerName))
{
onlinePlayersListbox.Items.Remove(playerName);
}
}
}
}
现在使用2个变量来设置玩家名称的起始索引,另一个用于设置要计算的字符数。通过这种方式,如果格式在未来发生变化,您只需要更新这些内容,其他所有内容都应该仍然有效。我还保留了LoginIdentifier和LogoutIdentifier的2个consts,你可以根据需要进行更改。
这也应该在IP地址中使用或不使用/。所以要么" [111"或" [/ 111"应该仍然适用于此。希望这会有所帮助。
答案 2 :(得分:0)
您可以遍历列表框的项目并搜索已拆分的对象并选择" left"分裂的一面。
string CheckForMatchNames()
{
foreach(string item in listbox.items)
for (int i = 0; i < preDeterminedStringArrayThatMustMatchSomething.Length; i++)
if (item.Split('[')[0] == preDeterminedStringArrayThatMatchesSomething[i])
return preDeterminedStringArrayThatMustMatchSomething[i];
return "none";
}