2012-10-04 197 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即可。


对不起,我们假设您接受了评论者的建议,并为每个服务器地址编写了新的客户端对象。