2012-10-04 194 views
1

確定一些背景。我正在寫一個從minecraft服務器獲取信息的TCP客戶端。多線程TCP客戶端

我想做一個客戶端,從10個服務器同時獲取信息。所以爲此我必須使用多線程。

這是我到目前爲止的代碼,但它似乎並沒有工作。

Imports System.Net.Sockets 
Imports System.Text 
Imports System.IO 

Module main 
Private socketclient As New System.Net.Sockets.TcpClient() 

Sub Main() 
    Dim serverList() As String = _ 
    {"ag1.playeoe.com", "lava-craft.net", "play.diamcraft.com", "mc.ecocitycraft.com", "main.kingscrafters.com", "pvp.cursecraft.net"} 

    For i = 0 To serverList.Length - 1 Step 1 
     Console.WriteLine("Connecting to " & serverList(i) & ":" & port & "..") 
     socketclient.BeginConnect(serverList(i), "25565", New AsyncCallback(AddressOf connect), socketclient) 
     Threading.Thread.Sleep(1000) 
    Next 

    Console.ReadLine() 

End Sub 

Public Sub connect(ByVal ar As IAsyncResult) 
    If socketclient.Connected = True Then 
     Console.WriteLine("Connected!") 
     Dim stream As NetworkStream = socketclient.GetStream 
     Dim sendBytes As [Byte]() = {&HFE} 
     Console.WriteLine("Sending Data...") 
     stream.Write(sendBytes, 0, sendBytes.Length) 

     'copied 
     Console.WriteLine("Recieving Response..." & vbNewLine) 
     Dim bytes(421) As Byte 
     stream.Read(bytes, 0, CInt(421)) 

     'Trim Bytes 
     Dim trimbytes(bytes.Length - 3) As Byte 
     Array.Copy(bytes, 3, trimbytes, 0, bytes.Length - 3) 

     'Process output 
     Dim sb As New System.Text.StringBuilder 
     For i As Integer = 1 To 241 Step 2 
      If trimbytes(i) <> 0 Then 
       sb.Append(ChrW(BitConverter.ToInt16(trimbytes, i))) 
      End If 
     Next i 
     Dim message() As String = sb.ToString.Split("§") 

     'Display OutPut 
     Console.WriteLine("----------Response Begin----------") 
     Console.WriteLine(message(0)) 
     Console.WriteLine(message(1)) 
     Console.WriteLine(message(2)) 
     Console.WriteLine("----------Response End----------" & vbNewLine & vbNewLine) 

     socketclient.Close() 
    End If 
End Sub 
End Module 

現在這似乎不起作用。我只從第一臺服務器獲取數據,但沒有收到其他數據。當我調試它時,它顯示該套接字未爲其他服務器打開。

這裏是您已經通過客戶端向BeginConnect的狀態變量輸出 OutPut of the program

+0

錯誤。我不知道任何VB,只開了這這是錯誤的,但是您需要爲每個服務器連接分別設置一個套接字實例 - 您不能每次都使用相同的套接字實例。 –

+0

除了呼叫睡眠之外,我在這個代碼中看不到任何多線程。也讓你的客戶端套接字在你的循環的頂部而不是在程序的頂部。 – grieve

+0

@ grieve - 這就是我的想法。回覆。多線程,是連接處理程序不在某些線程池線程的上下文中調用,(我不知道'因爲我知道沒有VB :)? –

回答

0

我沒有以任何方式VB的專家,所以你需要與語法的發揮,但這應該讓你開始:

Module main 

Sub Main() 
    Dim serverList() As String = _ 
    {"ag1.playeoe.com", "lava-craft.net", "play.diamcraft.com", "mc.ecocitycraft.com", "main.kingscrafters.com", "pvp.cursecraft.net"} 

    For i = 0 To serverList.Length - 1 Step 1 
     Console.WriteLine("Connecting to " & serverList(i) & ":" & port & "..") 
     Dim socketclient As New System.Net.Sockets.TcpClient() 
     socketclient.BeginConnect(serverList(i), "25565", New AsyncCallback(AddressOf  connect), socketclient) 
     Threading.Thread.Sleep(1000) 
    Next 

    Console.ReadLine() 

End Sub 

Public Sub connect(ByVal ar As IAsyncResult) 
    Dim socketClient As CType(ar.AsyncState, System.Net.Sockets.TcpClient) 
    If socketclient.Connected = True Then 
    ... // Everything else can stay the same. 
1

。您可以通過傳遞給您的回調的IAsyncResult(ar)來訪問特定的客戶端。只需將狀態屬性轉換爲TcpClient即可。


對不起,我們假設您接受了評論者的建議,併爲每個服務器地址編寫了新的客戶端對象。