Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 我如何能接收到许多彼此靠近的字符串?_Vb.net_String_Sockets - Fatal编程技术网

Vb.net 我如何能接收到许多彼此靠近的字符串?

Vb.net 我如何能接收到许多彼此靠近的字符串?,vb.net,string,sockets,Vb.net,String,Sockets,我正在制作一个VB.NET应用程序,它需要非常快速地发送/接收字符串(“命令”),但有一个小问题:当我用客户端非常快速地发送两个或更多连续字符串时,服务器只接收一个包含所有先前字符串的字符串 这是我的发送子(客户): 这是我的接收子系统(服务器,使用线程): 下面是一个发生了什么的例子: Client: send("1"), send("2"), send("hello"), send("18"). String received by Server: "12hello18". 我怎样

我正在制作一个VB.NET应用程序,它需要非常快速地发送/接收字符串(“命令”),但有一个小问题:当我用客户端非常快速地发送两个或更多连续字符串时,服务器只接收一个包含所有先前字符串的字符串

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

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

下面是一个发生了什么的例子:

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

String received by Server: "12hello18".
我怎样才能解决这个问题?
谢谢。

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

能否添加一些特殊字符作为命令前缀?比如说
&
?然后你会有
&1&2&hello&18
,在服务器端解释它会很简单。@KonradKokosa建议了一个好主意-这就是很多TCP/IP通信的方式。通常在键入的字符集中使用超出正常范围的ASCII字符。例如,在医疗通信中,HL7消息以ASCII 11开头,ASCII 28+ASCII 13结尾发送,因此它们的开始/停止字符不会被误认为消息正文中可能有效出现的任何字符。这将是一个很好的解决方案,但问题是,客户端不断地向服务器发送一些坐标,最后一个用户使用这些坐标在自己的表单上绘制一个矩形。这是一个很好的解决方案,但在这种情况下,应用程序会丢失实时同步。增加一个字节(对于
&
)如何会导致失去“实时同步”?让我们做一个示例:客户端发送这些坐标=0,0,服务器接收它们并绘制一个矩形。但是,如果客户端开始移动这个矩形,并连续发送它的坐标,如0,1,然后0,2,然后1,3 ecc,该怎么办。?服务器收到一个字符串,其中包含=“0,1&0,2&1,3”(您是如何说的)。它必须为每个坐标绘制矩形还是只为最后一个坐标绘制矩形?你知道我的意思吗?简而言之:服务器应该绘制位于客户端的矩形的真实位置。感谢您的解释。但是游戏中的同步是如何工作的呢?他们使用另一种传输协议吗?我不明白你所说的同步是什么意思,以及它与这个问题的关系。对于同步,我指的是服务器能够以自己的形式绘制位于客户端的矩形的真实位置。从他们所说的,我想这是不可能的。你在说什么?那个长方形是什么形状?!“他们”是谁?要明白你刚才所说的一切对我来说都是全新的,对这个问题来说似乎并不重要。要么问一个具体的后续问题,要么问一个全新的问题。对不起,我以为你已经读过前面的评论了。好吧,想象一个客户端可以在他的窗体上绘制和移动一个矩形,并将其坐标发送给服务器。现在,这个服务器接收到这些坐标并使用它们绘制另一个矩形,这次是在他自己的表单上。
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".