일부 배경. 나는 미니 크래프트 서버로부터 정보를 얻는 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를 모르는 만이 오픈 실수로 각 서버 연결마다 별도의 소켓 인스턴스가 필요합니다. 매번 동일한 소켓 인스턴스를 사용할 수는 없습니다. –
sleep 호출 외에도이 코드에서 멀티 스레딩이 전혀 표시되지 않습니다. 또한 클라이언트 소켓을 프로그램 상단이 아닌 루프 상단에 새로 추가하십시오. – grieve
@grieve - 그게 내가 생각한거야. 레. multithreading, 어떤 스레드 풀 스레드의 컨텍스트에서 호출되지 않은 connect-handler입니다 ('나는 VB를 모른다는 것을 알지 못합니다.)? –