2012-10-04 6 views
1

일부 배경. 나는 미니 크래프트 서버로부터 정보를 얻는 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

sleep 호출 외에도이 코드에서 멀티 스레딩이 전혀 표시되지 않습니다. 또한 클라이언트 소켓을 프로그램 상단이 아닌 루프 상단에 새로 추가하십시오. – grieve

+0

@grieve - 그게 내가 생각한거야. 레. multithreading, 어떤 스레드 풀 스레드의 컨텍스트에서 호출되지 않은 connect-handler입니다 ('나는 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)를 통해 특정 클라이언트에 액세스 할 수 있습니다. state 속성을 TcpClient에 캐스트하면됩니다.


죄송합니다. 여기서는 의견 작성자의 조언을 받아 각 서버 주소에 대한 새로운 클라이언트 개체를 새로 작성했다고 가정합니다.