整数到Byte()数组的麻烦

时间:2017-03-27 13:53:23

标签: .net arrays vb.net tcp stream

我正在尝试通过Visual Basic .NET中的stream传输数据 我尝试下一个:

客户端:

tcpclnt = New TcpClient()
tcpclnt.Connect("127.0.0.115", 40000)
clientstream = tcpclnt.GetStream()

 Dim I As Integer
 Dim msg() As Byte
 For I = 1 To 1000
     msg = BitConverter.GetBytes(I) ' HERE IS THE PROBLEM
     clientstream.Write(msg, 0, msg.Length)
 Next

服务器:

Public Shared bytes(1024) As Byte
Public Shared data As String = Nothing

Server = New TcpListener(IPAddress.Any, 40000)
Server.Start()
' ... some server routine

Dim serverstream As NetworkStream = myClient.GetStream()
Dim i As Int32
i = serverstream.Read(bytes, 0, bytes.Length)
data = System.Text.Encoding.ASCII.GetString(bytes, 0, i)
Invoke(Sub() TextBox3.Text = "Received: " + data)

问题是:要从流中获取数据,它必须是Byte()类型。因此,要将数据放入流中,它也必须位于Byte()中。但我想传输整数(例如1000)。它转换为4个字节,当服务器读取它时,它采用四个不同的符号,而不是数字1000!

而不是1000我有两个空格。

2 个答案:

答案 0 :(得分:1)

您必须使用BitConverter.ToInt32服务器端。请注意,代码将比您编写的代码稍微复杂一些,因为无法保证Read()将返回您请求的字节数,因为例如TCP数据包可以分成两部分({{3 }})。

代码应为:

Dim ix As Integer = 0
Dim bytes As Byte() = New Byte(3) {}

While ix < bytes.Length
    Dim read As Integer = serverstream.Read(bytes, ix, bytes.Length - ix)
    ix += read
End While

Dim i As Integer = BitConverter.ToInt32(bytes, 0)

答案 1 :(得分:0)

谢谢你的完美答案,@ xanatos。 我找到了另一种方法并使用它,所以我也想发布它。

我用这种方式:

 For I = 1 To 1000
        msg = Encoding.UTF8.GetBytes(Convert.ToString(I))
        clientstream.Write(msg, 0, msg.Length)
 Next

我认为你的解决方案在控制包方面更好,我会用它来传输数字数据,但对于我目前的情况,我使用了我的解决方案。