TCP的线程问题?

时间:2017-11-20 15:21:06

标签: vb.net multithreading tcp

我已经根据几年前在互联网上找到的一些VB代码编写了一个基于Windows的TCP服务器程序(我现在无法找到该链接,但它被称为" multi客户端服务器程序"或类似的东西)。

服务器与我开发的几个企业iPhone客户端应用程序进行通信。我已成功将此代码合并到两个独立的服务器程序中,这些程序在开发服务器和生产服务器上都能正常工作。我正在开发第三个iOS客户端应用程序和相应的服务器程序,它在开发机器上运行良好,但不能在生产服务器上运行 - 与托管其他两个服务器程序的机器没有问题。

工作了一段时间,但由于我已向服务器类添加了更多功能,它似乎已停止处理传入数据,但仅限于生产计算机上。

执行连接功能的代码包含在一个单独的公共类中,该公共类应该与处理传入数据的Windows表单进行通信。使用msgbox进行调试工具,我已经能够确认Client Connection类正在连接并正在接收数据,但由于某种原因,它不会将该数据与Windows表单进行通信。

我唯一的想法是它必须是一个线程问题,但我不确定,我不知道如何找出答案。

回顾一下,只是为了清楚:

  • 代码在开发服务器上运行正常,但在生产服务器上运行不正常。
  • 客户端连接类在各个方面与其他两个工作服务器程序完全相同。
  • 已确认客户端正在与客户端连接类进行通信。传入的数据可以在连接类中捕获并显示在msgbox中,因此数据正在通过。
  • 处理传入数据的Windows类未从公共客户端连接类接收数据。

编辑:我应该在原帖中包含这个:开发服务器是Win 7;生产服务器是Windows Server 2012。

由于此代码的复杂性,我不确定哪些代码段适用于此,但我会尽力在此处包含对我最有意义的内容。

这是整个客户端连接类,但发送传出数据的方法除外。同样,这是几年前从一个网站复制的,评论是原始开发者的评论:

Imports System.IO
Imports System.Net.Sockets
Imports System.Data.SqlClient

Public Class ConnectedClient

Private cli As TcpClient 'declare a tcp client which will be the client that we assign to an instance of this class

Private uniqueid As String 'this will be used for the name property
Dim strErrorLogPath As String

Public Property name ''This will be the name of the ID containing its Unique ID 
    Get
        Return uniqueid 'when we want to get it, it will return the Unique ID 
    End Get
    Set(ByVal value)
        uniqueid = value 'Used for setting the name
    End Set
End Property
Sub New(ByVal client As TcpClient)

    Dim r As New Random 'create a new random to serve as way to create our unique ID
    Dim x As String = String.Empty 'declare a new variable to hold the ID
    For i = 0 To 7 'we are going to have an ID of 7 randomly generated characters
        x &= Chr(r.Next(65, 89)) 'create a generate dnumber between 65 and 89 and get the letter that has the same ascii value (A-Z)
        '                         and add it onto the ID string
    Next

    Me.name = client.Client.RemoteEndPoint.ToString().Remove(client.Client.RemoteEndPoint.ToString().LastIndexOf(":")) & " - " & x 'set the name to the Unique ID 
    cli = client 'assign the client specified to the TCP client variable to we can operate with it
    cli.GetStream.BeginRead(New Byte() {0}, 0, 0, AddressOf read, Nothing) 'start reading using the read subroutine

End Sub


Public Event gotmessage(ByVal message As String, ByVal client As ConnectedClient)    'this is raised when we get a message from the client

Public Event disconnected(ByVal client As ConnectedClient)    'this is raised when the client disconnects

Sub read(ByVal ar As IAsyncResult) 'this will process all messages being received

    'bn-note: This is the entry point of the data being received from the client.

    Try
        Dim sr As New StreamReader(cli.GetStream) 'initialize a new streamreader which will read from the client's stream
        Dim msg As String = sr.ReadLine() 'create a new variable which will be used to hold the message being read
        If msg = "" Then
            RaiseEvent disconnected(Me)  'WE CAN ASSUME THE CLIENT HAS DISCONNECTED

            Exit Try
            'msg = "Null Message"
        End If
        WriteToRawIncomingDataLog(msg)
        RaiseEvent gotmessage(msg, Me) 'tell the server a message has been received. Me is passed as an argument which represents 
        '                               the current client which it has received the message from to perform any client specific
        '                               tasks if needed

        cli.GetStream.BeginRead(New Byte() {0}, 0, 0, AddressOf read, Nothing) 'continue reading from the stream
        'End Ifz
        'Catch ex As System.NullReferenceException

    Catch ex As Exception
        Try 'if an error occurs in the reading purpose, we will try to read again to see if we still can read
            Dim sr As New StreamReader(cli.GetStream) 'initialize a new streamreader which will read from the client's stream
            Dim msg As String = sr.ReadLine() 'create a new variable which will be used to hold the message being read
            WriteToRawIncomingDataLog(msg)
            RaiseEvent gotmessage(msg, Me) 'tell the server a message has been received. Me is passed as an argument which represents 
            '                               the current client which it has received the message from to perform any client specific
            '                               tasks if needed
            cli.GetStream.BeginRead(New Byte() {0}, 0, 0, AddressOf read, Nothing) 'continue reading from the stream
            'End If
            'Catch ex2 As System.NullReferenceException
            '   Stop
        Catch ' IF WE STILL CANNOT READ
            RaiseEvent disconnected(Me)  'WE CAN ASSUME THE CLIENT HAS DISCONNECTED
        End Try

    End Try
End Sub

以下是处理传入数据的Windows表单代码:

Private Sub formMain_Load(sender As Object, e As System.EventArgs) Handles Me.Load
    Try
        Dim listener As New System.Threading.Thread(AddressOf listen) 'initialize a new thread for the listener so our GUI doesn't lag
        listener.IsBackground = True
        listener.Start(CInt(IncomingPortString)) 'start the listener, with the port specified as a parameter (textbox1 is our port textbox)
    Catch ex As Exception
        txtSystemMessages_AddText(String.Format("Error in formMain_Load sub: {0}{1}", ex.Message.ToString, vbNewLine))

    End Try
End Sub

 Sub listen(ByVal port As Integer)
   Try
        Dim t As New TcpListener(IPAddress.Any, port) 'declare a new tcplistener
        t.Start() 'start the listener
        Do
            Dim client As New ConnectedClient(t.AcceptTcpClient) 'initialize a new connected client
            AddHandler client.gotmessage, AddressOf received 'add the handler which will raise an event when a message is received
            AddHandler client.disconnected, AddressOf disconnected 'add the handler which will raise an event when the client disconnects

        Loop Until False
    Catch ex As Exception
        txtSystemMessages_AddText(String.Format("Error in Listen sub: {1}{2}", ex.Message.ToString, vbNewLine))
    End Try

End Sub

 Sub received(ByVal msg As String, ByVal client As ConnectedClient)
     Try
        If Not clients.ContainsKey(client) Then
            clients.Add(client, client.name.ToString) 'add the client to our hashtable
        End If

    Catch ex As ArgumentException

    End Try

      (The sub that processes the incoming data string "msg".)

 End Sub

我完全不知道可能导致这个问题的原因,而且线程问题是我能想到的。不同的机器可以有不同的线程方案吗?任何帮助将不胜感激。

0 个答案:

没有答案