确定一些背景。我正在写一个从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 :)? –