[英]Multithreading TCP client
确定一些背景。 我正在编写一个TCP客户端,该客户端从Minecraft服务器获取信息。
我想让一个客户端同时从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。 您可以通过传递给回调的IAsyncResult(ar)访问特定的客户端。 只需将state属性转换为TcpClient即可。
抱歉,假设您听取了评论者的建议,并为每个服务器地址新建了一个新的客户端对象。
无论如何我都不是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.
您正在将beginConnect函数的参数PORT作为字符串而不是整数传递。
隐式转换将0作为函数调用中的参数。
(int)“ 25565” = 0
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.