確定一些背景。我正在寫一個從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的狀態變量輸出
錯誤。我不知道任何VB,只開了這這是錯誤的,但是您需要爲每個服務器連接分別設置一個套接字實例 - 您不能每次都使用相同的套接字實例。 –
除了呼叫睡眠之外,我在這個代碼中看不到任何多線程。也讓你的客戶端套接字在你的循環的頂部而不是在程序的頂部。 – grieve
@ grieve - 這就是我的想法。回覆。多線程,是連接處理程序不在某些線程池線程的上下文中調用,(我不知道'因爲我知道沒有VB :)? –