2012-07-30 72 views
0

我的应用程序正在通过TCP接收命令,如果我试图比较命令比较总是失败。比较字符串总是失败(字符串从字节()转换)

消息被转换为字节()并返回,但应该在下面的示例中比较ok吗?或者我错过了什么?

Imports MyApp.Client 

Public Class Form1 
    Public Delegate Sub MessageReceivedHandler(ByVal message As String) 

    Private Sub Message_Received(ByVal message As String) 
     'update the display using invoke 
     Invoke(New MessageReceivedHandler(AddressOf PrintToScreen), New Object() {message}) 
    End Sub 

    Private Sub PrintToScreen(ByVal msg As String) 
     Select Case msg 
      Case "#all" 
       'Do Something 
      Case Else 
       'Do Something Else 
     End Select 
    End Sub 
End Class 


'Client class 
Public Class Client 
    Private _tcpClient As TcpClient 
    Public Event MessageReceived As MessageReceivedHandler 

    Public Sub Connect(ByVal address As IPAddress, ByVal port As Integer) 
     _tcpClient = New TcpClient() 
     Dim serverEndPoint As New IPEndPoint(address, port) 
     _tcpClient.Connect(serverEndPoint) 
     ThreadPool.QueueUserWorkItem(New WaitCallback(AddressOf Read)) 
    End Sub 

    Public Sub Send(ByVal buffer As Byte()) 
     _tcpClient.GetStream().Write(buffer, 0, buffer.Length) 
     _tcpClient.GetStream().Flush() 
    End Sub 

    Private Sub Read() 
     Dim encoder As New ASCIIEncoding() 
     Dim buffer As Byte() = New Byte(4095) {} 
     Dim bytesRead As Integer 
     While True 
      Try 
       bytesRead = _tcpClient.GetStream().Read(buffer, 0, 4096) 
       RaiseEvent MessageReceived(encoder.GetString(buffer, 0, bytesRead).ToString) 
      Catch ex As IO.IOException 
       Application.Exit() 
      End Try 
     End While 
    End Sub 

    Public Sub Dispose() 
     _tcpClient.Close() 
    End Sub 
End Class 

变量是含有相同的文字的情况下的字符串,但它未能通过比较:

Msg Variable

+1

请问您可以将其工作到最小的可重复范例吗? – asawyer 2012-07-30 15:18:53

+1

什么是从套接字读取的字节? ASCII编码后产生的字符串是什么?哪个字符与预期不同?正如@asawyer所说,请简化这个例子到几行代码,它们重现了根本不涉及TCP通信的问题。例如,你的例子可以简单地声明一个字节数组,用预期的硬编码值填充它,然后ascii将它编码为一个字符串,然后将它与预期的字符串进行比较。 – 2012-07-30 15:31:18

+0

我怀疑问题根本不在于编码,而是在您确定收到完整的消息之前立即提升“MessageReceived”事件。例如,当你调用'_tcpClient.GetStream()。Read'时,它可能只返回消息的第一部分,因为这是迄今为止所收到的全部内容。 – 2012-07-30 15:47:59

回答

2

发现问题,发送应用程序被添加vbNullChar到的端部在转换为byte()并发送之前的字符串。 (无法看到从接收端转换的字符串中删除它的方法)

+0

我是从MS Access通过一个完整的文件路径(数据实际上在SQL Server保持)我已经开发了一个COM对象,我的代码是失败,这解决方案解决了这个问题对我,所以我最终采取1个更少字符我最后的VB代码为_sFileName = MID(路径,POS + 1,(LEN(路径) - POS - 1))_其中,路径是像C:\ TEMP \ fred.jpg – Hornbydd 2014-06-19 15:45:45