2015-12-11 119 views
0

我嘗試使用C#應用程序中的telnet連接到我的TeamSpeak 3服務器。Ts3與C#的telnet連接#

順便說一句,我不是使用telnet非常有經驗的^^」,所以我展示了遠程登錄的代碼在網站 https://msdn.microsoft.com/en-us/library/system.net.sockets.tcpclient(VS.80).aspx

下面的代碼應:

  1. 連接到服務器teamspeak
  2. 發送密碼,並宣讀了歡迎消息
  3. 發送命令「幫助」並讀出幫助信息

    string command = "help"; 
    
        // creates new TCP client 
        TcpClient client = new TcpClient(adress, port); 
    
        // get client stream 
        NetworkStream stream = client.GetStream(); 
    
        // send Password 
        Byte[] data = System.Text.Encoding.ASCII.GetBytes(password); 
        stream.Write(data, 0, data.Length); 
        data = new Byte[256]; 
        Thread.Sleep(200); 
    
        Int32 bytes = stream.Read(data, 0, data.Length); 
        String responseData = System.Text.Encoding.ASCII.GetString(data, 0, bytes); 
        Console.WriteLine(responseData); 
    
    
        // send the given command 
        Byte[] data2 = System.Text.Encoding.ASCII.GetBytes(command); 
        stream.Write(data2, 0, data2.Length); 
        data2 = new Byte[2560]; 
        Thread.Sleep(200); 
    
        Int32 bytes2 = stream.Read(data2, 0, data2.Length); 
        String responseData2 = System.Text.Encoding.ASCII.GetString(data2, 0, bytes2); 
        Console.WriteLine(responseData2); 
    
        // end stream and client 
        stream.Close(); 
        client.Close(); 
    

第一查詢的工作,因爲它應該和歡迎信息寫入到控制檯。但是,在第二個查詢中,在Int32 bytes2 = stream.Read(data2, 0, data2.Length);處,應用程序停止而不返回任何豁免。

任何人都可以解釋爲什麼我不能讀出幫助信息嗎?

+0

如果你並不反對使用庫我有一個NuGet包在https://www.nuget.org/packages/ Telnet(代碼位於https://github.com/9swampy/Telnet/)可以爲你做所有的telnet通信... – 9swampy

+0

感謝你的提議,但是當我可以自己實現時,我總是很高興。所以我知道我在做什麼。 ^^ – Gonios

+0

是的,我也有點喜歡。看看Github上的代碼,然後如果你仍然陷入困境。祝你好運。 – 9swampy

回答

0

應用程序似乎停止的原因是因爲NetworkStream.Read()將會阻塞,如果沒有數據可讀取且連接仍處於打開狀態。請注意,在致電stream.Read(data2, 0, data2.Length)之前,我們可以看到stream.DataAvailable屬性設置爲false。現在

enter image description here

,至於爲什麼沒有可用的數據:你需要一個換行符終止你的命令,以便TeamSpeak知道命令完成:

string command = "help\n"; 

... 

// send the given command 
byte[] data2 = Encoding.ASCII.GetBytes(command); 
stream.Write(data2, 0, data2.Length); 

第一個查詢實際上沒有成功,出於同樣的原因。歡迎消息由連接上的服務器發送;這不是對你的命令的迴應。此外,我什麼也看不見的password值,但如果你打算登錄的完整的命令是login <username> <password>,就像這樣:

TS3
歡迎TeamSpeak 3 ServerQuery界面,輸入「help 「以獲取命令列表和」幫助<命令>「以獲取有關特定命令的信息。
登錄的ServerAdmin獵頭
錯誤ID = 0味精= OK