vb.net服务器 - 多个客户端不断处理不同的信息

时间:2013-05-21 14:35:07

标签: vb.net sockets asynchronous tcp tcplistener

我正在寻找帮助编写服务器应用程序来为客户端提供更新文本流。我的要求如下:

我需要能够在服务器端口7878上获得客户端请求信息并接收一组初始值,然后每5秒报告一次更改的值。我的悬念一直是连接另一个客户。我需要能够连接第二个(或第三个或第四个)客户端,而第一个客户端仍在运行。第二个客户端将收到初始值,然后也开始更新。我需要两个流完全相互独立。这可能与VB.Net和TCP套接字一起使用吗?

编辑添加:我已经粘贴了一些我可以分享的代码。 WriteLog是一个与我的问题无关的独立子。此代码将允许客户端连接,然后允许另一个客户端连接,但所有到第一个客户端的传输都在新连接上停止。

    Public Class ServerApp

    Dim serverSocket As New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
    Dim clientSocket As New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)

Private Sub ServerApp_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    WriteLog(String.Format("Start of form load.."))

    Dim listener As New Thread(New ThreadStart(AddressOf ListenForRequests))
    listener.IsBackground = True
    listener.Start()
End Sub

Private Sub ListenForRequests()

    Dim CONNECT_QUEUE_LENGTH As Integer = 4

    serverSocket.Bind(New IPEndPoint(IPAddress.Any, 7878))
    serverSocket.Listen(CONNECT_QUEUE_LENGTH)
    serverSocket.BeginAccept(New AsyncCallback(AddressOf OnAccept), Nothing)
End Sub

Private Sub OnAccept(ByVal ar As IAsyncResult)
    clientSocket = serverSocket.EndAccept(ar)
    serverSocket.BeginAccept(New AsyncCallback(AddressOf OnAccept), Nothing)
    WriteLog("just accepted new client")

    Try
        clientSocket.Send(Encoding.UTF8.GetBytes("first response on connect"), SocketFlags.None)
        While True
            clientSocket.Send(Encoding.UTF8.GetBytes("string of updates"), SocketFlags.None)
            Thread.Sleep(5000)
        End While
    Catch ex As Exception
        WriteLog(ex.Message)
        WriteLog("Remote host has disconnected")
    End Try

End Sub

End Class

1 个答案:

答案 0 :(得分:0)

我建议尝试UdpClient课程,我发现它更容易使用和理解。

现在有些代码...

Imports System.Net.Sockets
Imports System.Threading
Imports System.Text
Imports System.Net

Public Class Form1

    Private port As Integer = 7878
    Private Const broadcastAddress As String = "255.255.255.255"
    Private receivingClient As UdpClient
    Private sendingClient As UdpClient
    Private myTextStream As String = "Blah blah blah"
    Private busy As Boolean = False

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
        InitializeSender()
        InitializeReceiver()
    End Sub

    Private Sub InitializeSender()
        Try
            sendingClient = New UdpClient(broadcastAddress, port)
            sendingClient.EnableBroadcast = True
        Catch ex As Exception
            MsgBox("Error, unable to setup sender client on port " & port & "." & vbNewLine & vbNewLine & ex.ToString)
        End Try
    End Sub

    Private Sub InitializeReceiver()
        Try
            receivingClient = New UdpClient(port)
            ThreadPool.QueueUserWorkItem(AddressOf Receiver)
        Catch ex As Exception
            MsgBox("Error, unable to setup receiver on port " & port & "." & vbNewLine & vbNewLine & ex.ToString)
            End
        End Try
    End Sub

    Private Sub sendStream()
        busy = True
        Dim i% = 0
        Do While i < 4
            If myTextStream <> "" Then
                Dim data() As Byte = Encoding.ASCII.GetBytes(myTextStream)
                Try
                    sendingClient.Send(data, data.Length)
                Catch ex As Exception
                    MsgBox("Error, unable to send stream." & vbNewLine & vbNewLine & ex.ToString)
                    End
                End Try
            End If
            Thread.Sleep(5000)
            i += 1
        Loop
        busy = False
    End Sub

    Private Sub Receiver()
        Dim endPoint As IPEndPoint = New IPEndPoint(IPAddress.Any, port)
        While True
            Dim data() As Byte
            data = receivingClient.Receive(endPoint)
            Dim incomingMessage As String = Encoding.ASCII.GetString(data)
            If incomingMessage = "what ever the client is requesting, for example," & "GET_VALUES" Then
                If busy = False Then Call sendStream()
            End If
        End While
    End Sub
End Class

一些可能有用的链接:Herehereherehere