TCP服务端vb.net支持多客户端连接

Imports System.Threading
Imports System.IO
Imports System.Net
Imports System.Net.Sockets

Public Class Form1
    Private thThreadRead As Thread
    Private tlTcpListen As TcpListener
    Private lstClient As List(Of TcpClient)
    Private blistener As Boolean = True

    Private Sub CheckBox1_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CheckBox1.CheckedChanged
        If CheckBox1.Checked = True Then
            blistener = True
            thThreadRead = New Thread(New ThreadStart(AddressOf dowork))
            thThreadRead.IsBackground = True
            thThreadRead.Start()
        Else
            StatusBar1.Text = "正在停止监听..."
            blistener = False
            thThreadRead.Abort()
            For Each tclient In lstClient
                tclient.Client.Close()
            Next
            tlTcpListen.Stop()
            lstClient.Clear()
            StatusBar1.Text = "监听已经停止"
        End If
    End Sub

    Private Sub dowork()
        Dim iPort As Integer = 8000
        Dim localAddr As IPAddress = IPAddress.Any
        iPort = CInt(numPort.Value)
        tlTcpListen = New TcpListener(localAddr, iPort)
        tlTcpListen.Start()
        StatusBar1.Text = "正在监听..."
        lstClient = New List(Of TcpClient)
        lstClient.Clear()
        Do While True
            Dim tcClient As TcpClient = tlTcpListen.AcceptTcpClient
            lstClient.Add(tcClient)
            Dim thd As New Thread(New ParameterizedThreadStart(AddressOf Listen))
            thd.IsBackground = True
            thd.Start(tcClient)
        Loop
    End Sub

    '错误1:每连接一个主机就会创建一个线程,但是主机断开连接时线程仍然没有关闭
    Private Sub Listen(ByVal tcClient As TcpClient)
        Try
            Dim nsStream As NetworkStream = tcClient.GetStream()
            StatusBar1.Text = "已经建立TCP连接!" + tcClient.Client.RemoteEndPoint.ToString()
            While blistener
                Dim sMessage As String = ""
                If nsStream.DataAvailable Then '是否有可用数据
                    Dim buf(8 * 1024) As Byte
                    Dim slen = nsStream.Read(buf, 0, buf.Length)
                    sMessage = System.Text.Encoding.UTF8.GetString(buf)
                    sMessage = sMessage.Substring(0, slen)
                End If
                If sMessage <> "" Then
                    Dim sTime As String = DateTime.Now.ToShortTimeString()
                    sMessage = sTime + " " + tcClient.Client.RemoteEndPoint.ToString() + " [" + sMessage + "]" + vbCrLf
                    Me.Invoke(New EventHandler(Sub() TextBox1.AppendText(sMessage)))
                End If
                'Threading.Thread.Sleep(1)
            End While
        Catch ex As System.Exception
            MessageBox.Show(ex.Message, "错误")
        End Try
    End Sub

    '错误2:每连接一个主机lstClient就添加一个对象。但是连接后在断开这个对象并没有删除
    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        '向每一个主机发送信息
        For Each tclient In lstClient
            Dim sw As StreamWriter = New StreamWriter(tclient.GetStream())
            sw.Write(TextBox2.Text)
            sw.Flush()
        Next

    End Sub
End Class

上面是TCP服务端代码。窗体界面很简单就不贴了。供大家分享。

目前还有2个缺陷。代码注释有说明,有大神路过请指正。

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
VB.NET中,可以通过使用TcpListener和TcpClient类来实现多客户端TCP通信。 首先,需要使用TcpListener类来监听指定的IP地址和端口号,以等待客户端连接请求。可以使用下面的代码实现: ``` Dim listener As New TcpListener(IPAddress.Any, port) listener.Start() ``` 其中,port是指定的端口号,可以根据需要进行设置。 然后,可以使用TcpClient类来接受客户端连接请求,并与客户端建立连接。可以使用下面的代码实现: ``` Dim client As TcpClient = listener.AcceptTcpClient() ``` 接下来,可以通过client对象来进行数据的收发操作。可以使用NetworkStream类来实现对数据流的读写。可以使用下面的代码实现: ``` Dim stream As NetworkStream = client.GetStream() ``` 然后,可以使用StreamReader和StreamWriter类来进行数据的读写操作。可以使用下面的代码实现: ``` Dim reader As New StreamReader(stream) Dim writer As New StreamWriter(stream) ``` 可以使用reader对象来接收客户端发送的数据,使用writer对象来向客户端发送数据。例如,可以使用下面的代码实现接收客户端发送的字符串数据并向客户端发送响应: ``` Dim receivedData As String = reader.ReadLine() Console.WriteLine("收到客户端消息:" & receivedData) Dim response As String = "收到消息:" & receivedData writer.WriteLine(response) writer.Flush() ``` 当与一个客户端的通信完成后,可以关闭TcpClient对象和NetworkStream对象。可以使用下面的代码实现: ``` reader.Close() writer.Close() stream.Close() client.Close() ``` 在主程序的代码中,可以使用循环来不断地接受新的客户端连接请求,并进行与客户端的通信。例如,可以使用下面的代码实现: ``` While True Dim client As TcpClient = listener.AcceptTcpClient() Dim stream As NetworkStream = client.GetStream() Dim reader As New StreamReader(stream) Dim writer As New StreamWriter(stream) ' 进行数据收发操作 reader.Close() writer.Close() stream.Close() client.Close() End While ``` 以上就是利用VB.NET实现多客户端TCP通信的基本方法,可以根据实际需求进行相应的处理和调整。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值