2014-07-03 23 views
-1

我正在做一个VB.NET应用程序,需要非常快速的发送/接收字符串(“命令”),但有这个小问题:当我连续发送2个或更多连续的字符串与客户端,服务器只接收包含所有以前的字符串的单个字符串。我怎样才能收到很多相互靠近的琴弦?

这是我发送子(客户端):

Public Sub send(ByVal s As String) 
    Dim temp() As Byte = UTF8.GetBytes(s) 
    Try 
     stream.Write(temp, 0, temp.Length) 
    Catch ex As Exception 
     MsgBox(ex.Message) 
    End Try 
End Sub 

这是我的接收子(服务器,使用一个线程):

Public Sub listen() 
    Do 
     If client.Available > 0 
      Dim temp(client.Available - 1) As Byte 
      stream.Read(temp, 0, temp.Length) 
      Dim text As String = UTF8.GetString(temp) 

      'some checks on the string (example = if text.StartWith("something") then...) 
     End If 
    Loop 
End Sub 

这里是发生了什么一个例子:

Client: 
send("1"), 
send("2"), 
send("hello"), 
send("18"). 

String received by Server: "12hello18". 

我该如何解决这个问题? 谢谢。

+2

你可以添加一些特殊字符作为*命令前缀*吗?就像,例如'&'?然后你将拥有'&1&2&hello&18',并且在服务器端解释它会很简单。 –

+1

@KonradKokosa建议一个好主意 - 这就是很多TCP/IP通信的完成方式。通常使用的ASCII字符超出了你在输入字符集中使用的正常范围。例如,在医疗通信中,HL7消息在开始时以ASCII 11发送,最后以ASCII 28 + ASCII 13发送,因此它们启动/停止字符不会被误认为可能在消息体中有效出现的任何内容。 – PulseLab

+0

嗯,这将是一个很好的解决方案,但问题是客户端连续发送一些坐标到服务器,最后一个使用这些坐标在他自己的窗体上绘制一个矩形。这是一个很好的解决方案,但在这种情况下,应用程序会失去实时同步。 – Dadex

回答

0

您假定Read一次读取“消息”。 TCP不是基于消息的。它为您提供无边界的字节流。研究消息框架。通常,通过在发送消息本身之前将每个消息的长度预先设置为int来解决此问题。

+0

感谢您的解释。但是游戏中的同步过程如何工作?他们使用另一种传输协议吗? – Dadex

+0

我不明白你的意思是同步以及它与这个问题有什么关系。 – usr

+0

对于同步,我的意思是服务器能够以自己的形式绘制位于客户端的矩形的实际位置。从他们所说的话,我想这是不可能的。 – Dadex