mirror of
https://e.coding.net/circlecloud/CTZLauncher.git
synced 2025-11-24 21:36:06 +00:00
选择服务器后自动获取服务器在线人数...
This commit is contained in:
98
CTZLauncher/Tools/MinecraftTools.cs
Normal file
98
CTZLauncher/Tools/MinecraftTools.cs
Normal file
@@ -0,0 +1,98 @@
|
||||
using CTZLauncher.Modules.Minecraft;
|
||||
using LitJson;
|
||||
using System;
|
||||
using System.Net.Sockets;
|
||||
using System.Text;
|
||||
using System.Threading;
|
||||
using System.Windows.Threading;
|
||||
|
||||
namespace CTZLauncher.Tools
|
||||
{
|
||||
public class MinecraftServer
|
||||
{
|
||||
string address;
|
||||
int port;
|
||||
bool finish;
|
||||
ServerInfo serverinfo;
|
||||
|
||||
/// <summary>
|
||||
/// 获取服务器详细信息
|
||||
/// </summary>
|
||||
/// <param name="address">服务器地址</param>
|
||||
/// <param name="port">服务器端口</param>
|
||||
public MinecraftServer(string address, int port)
|
||||
{
|
||||
this.address = address;
|
||||
this.port = port;
|
||||
}
|
||||
/// <summary>
|
||||
/// 模仿C#的Application.Doevent函数。可以适当添加try catch 模块
|
||||
/// </summary>
|
||||
public void DoEvent()
|
||||
{
|
||||
DispatcherFrame frame = new DispatcherFrame();
|
||||
Dispatcher.CurrentDispatcher.BeginInvoke(DispatcherPriority.Background, new DispatcherOperationCallback(ExitFrame), frame);
|
||||
Dispatcher.PushFrame(frame);
|
||||
}
|
||||
public object ExitFrame(object f)
|
||||
{
|
||||
((DispatcherFrame)f).Continue = false;
|
||||
return null;
|
||||
}
|
||||
/// <summary>
|
||||
/// 异步获取服务器信息
|
||||
/// </summary>
|
||||
/// <returns>服务器信息</returns>
|
||||
public ServerInfo DoAsync()
|
||||
{
|
||||
new Thread(new ThreadStart(GetInfoAsync)).Start();
|
||||
while (finish == false) { DoEvent(); }
|
||||
return serverinfo;
|
||||
}
|
||||
/// <summary>
|
||||
/// 获取服务器信息
|
||||
/// </summary>
|
||||
/// <returns>服务器信息</returns>
|
||||
public ServerInfo Do()
|
||||
{
|
||||
return GetInfo();
|
||||
}
|
||||
public void GetInfoAsync()
|
||||
{
|
||||
finish = false;
|
||||
serverinfo = GetInfo();
|
||||
finish = true;
|
||||
}
|
||||
public ServerInfo GetInfo()
|
||||
{
|
||||
using (Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp))
|
||||
{
|
||||
try
|
||||
{
|
||||
client.Connect(address, port);
|
||||
if (client.Connected)
|
||||
{
|
||||
client.Send(new byte[] { 0x0f, 0x00, 0x04, 0x09, 0x31, 0x32, 0x37, 0x2e, 0x30, 0x2e, 0x30, 0x2e, 0x31, 0x63, 0xdd, 0x01 });
|
||||
client.Send(new byte[] { 0x01, 0x00 });
|
||||
byte[] header = new byte[5];
|
||||
client.Receive(header, header.Length, SocketFlags.None);
|
||||
byte[] buffer = new byte[1024];
|
||||
int recover = client.Receive(buffer, buffer.Length, SocketFlags.None);
|
||||
byte[] data = new byte[recover];
|
||||
Array.Copy(buffer, data, recover);
|
||||
string info = Encoding.UTF8.GetString(data);
|
||||
return JsonMapper.ToObject<ServerInfo>(info);
|
||||
}
|
||||
Console.WriteLine("网络连接失败!");
|
||||
return null;
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
Console.WriteLine(e.Message);
|
||||
Console.WriteLine(e.StackTrace);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user