2012-10-03 73 views
2

我正在嘗試使用數據包在c#中創建Minecraft假客戶端a.k.a Minecraft chatbot。 我已經嘗試了很多不同的方式來實現這一點,但沒有運氣。爲什麼數據包發送不發送數據(與Minecraft服務器握手)?

每次我發送一個數據包,它都不發送數據(使用packetsniffer)。 雖然packetsniffer說,數據包的總大小是:190個字節。 ,大小爲:17字節。

這裏是我的代碼:

static TcpClient client = new TcpClient(); 
    static void Main(string[] args) 
    { 
     Console.WriteLine("Start GATHERING INFO....."); 

     Console.Write("Write a ip: "); 
     IPAddress ip = IPAddress.Parse("192.168.178.11"); 
     try 
     { 
      ip = IPAddress.Parse(Console.ReadLine()); 
     } 
     catch 
     { 
      Console.Write("\nUnknown/Wrong ip entered redirecting to : 127.0.0.1 (AKA Localhost)"); 
      ip = IPAddress.Parse("192.168.178.11"); 
     } 
     Console.Write("\nWrite a port: "); 
     int port = int.Parse(Console.ReadLine()); 

     Console.WriteLine("Connecting....."); 

     try 
     { 
      client.Connect(ip, port); 
      client.NoDelay = false; 
      Console.WriteLine("Connection succesfull!"); 
     }catch 
     { 
      Console.WriteLine("--== ERROR WHILE TRYING TO CONNECT PLEASE RESTART PROGRAM ==--"); 
      Console.ReadKey(); 
      client.Close(); 
      Main(args); 
     } 

     Stream stream = client.GetStream(); 

     Console.Write("Please enter a username: "); 
     string usrn = Console.ReadLine(); 
     Console.Write("\n"); 

     byte[] data = new byte[3 + usrn.Length*2]; 
     data[0] = (byte)2; 
     data[1] = (byte)29; 
     gb(usrn).CopyTo(data, 2); 

     stream.Write(data, 0, data.Length); 

     Console.ReadKey(); 

    } 

    public static byte[] gb(String str) 
    { 
     return System.Text.ASCIIEncoding.ASCII.GetBytes(str); 
    } 

下面是數據包應該如何看起來像:

http://www.wiki.vg/Protocol#Handshake_.280x02.29

我忽略了,因爲其他的機器人沒有使用它的服務器主機和服務器端口。 (雖然他們沒有工作:/

這裏是原來的客戶端數據包會怎樣:

'顯示怪異轉到:https://dl.dropbox.com/u/32828727/packetsocketsminecraft.txt'

timboiscool9(我的用戶名) 192.168.178.1(服務器IP)

還有更多之後,但是這是我需要的。

我是相當新的插座和tcpclients

+0

這裏有很多奇怪的事情發生。你爲什麼要調用'Main(args)'而不使用'while'循環?你不需要第一次解析ip,因爲你會直接在'try'中覆蓋它。爲了提高可讀性,使用比'gb'更多的描述性方法名稱。 C#可以處理更長的方法名稱(同樣適用於變量名稱)! – Default

+0

失敗後我該如何回到起點?因爲一段時間循環,它只會繼續。 (也許是goto?) –

+0

你是什麼意思,它會繼續?在條件錯誤之前它不會繼續。你可以做'while(!done)'並設置'done = true;'當client.Connect'成功時 – Default

回答

2

我清理你的代碼位:

static void Main(string[] args) 
    { 
     bool keepTrying = true; 
     while (keepTrying) 
     { 
      Console.Write("Enter server IP Address: "); 
      IPAddress ip; 
      if(!IPAddress.TryParse(Console.ReadLine(), out ip)) 
      { 
       Console.WriteLine("Invalid ip entered, defaulting to 192.168.178.11"); 
       ip = IPAddress.Parse("192.168.178.11"); 
      } 

      Console.Write("Enter server port: "); 
      Int16 port; 
      if(!Int16.TryParse(Console.ReadLine(), out port)) 
      { 
       Console.WriteLine("Invalid port entered, defaulting to 1234"); 
       port = 1234; 
      } 

      Console.WriteLine("Connecting....."); 

      try 
      { 
       TcpClient client = new TcpClient(); 
       client.Connect(new IPEndPoint(ip, port)); 
       client.NoDelay = false; 
       Console.WriteLine("Connection succesfull!"); 

       List<byte> data = new List<byte>() { 2, 29 }; 
       Console.Write("Please enter a username: "); 
       byte[] userName = ASCIIEncoding.ASCII.GetBytes(Console.ReadLine()); 
       data.AddRange(userName); 

       using (var stream = client.GetStream()) 
       { 
        stream.Write(data.ToArray(), 0, data.Count); 
        Console.Write("Data sent!"); 
       } 
       keepTrying = false; 
      } 
      catch 
      { 
       Console.WriteLine("--== ERROR CONNECTING ==--"); 
       Console.WriteLine(); 
      } 
     } 
    } 

至於你原來的問題,我們需要更多的信息。你說數據包嗅探器沒有顯示數據,但是你說數據有一個大小。那麼你是否看到數據?你確定服務器啓動了嗎?我發佈的代碼適用於我,這意味着它連接到本地系統上的服務器併發送字節。

+0

那麼數據包嗅探器不會顯示數據,但它說它有一個大小(奇怪)。服務器也啓動了。 –

+0

它不會給我任何更多的錯誤,我只需要進一步發展(更多的數據包等),所以也許生病後回到這個帖子idk。 –

+1

沒有理由在'catch'子句中設置'keepTrying'標誌 - 只有在所有內容都運行之後,才能將其設置爲false。你也不需要設置'ip = null','IpAddress ip;'應該就足夠了(同樣適用於'port = 0;')。儘管TryParse很不錯。 – Default

0

這有點舊,但我仍然會看看我能否幫助你。

Minecraft協議相當複雜,如果不實現絕大多數服務器,您將無法連接到Minecraft服務器。該協議的細節可以找到here

我建議你考慮走不同的路線。由於Minecraft的複雜程度,我會避免自己實施。幸運的是,我是一名Minecraft愛好者,我爲你完成了大部分工作。我建議你看看Craft.Net庫。它包含一個完整的協議實現,並從中創建一個聊天機器人將是微不足道的。實際上,here's一個使用Craft.Net的示例聊天程序供您閱讀。