VB.net flash XMLSocket替换应用程序

时间:2010-08-20 02:39:17

标签: vb.net sockets xmlsocket

我正在尝试使用VB.net(express 2010)应用程序连接到套接字服务器(保持连接打开),我该怎么做呢?现在它使用flash XMLsocket工作,我正在尝试使用现有服务器构建一个没有flash的新客户端。

目前我只是使用一个显示消息的简单窗口和一个发送消息的地方。

它说我已连接,但它没有显示任何消息,并且发送的消息似乎没有效果,当我使用相同的IP和端口telnet到服务器时,我可以看到消息进入我,所以我知道我可以连接到服务器。这是我的代码:

Imports System.Text
Imports System.Net.Sockets


Public Class Form1
    Inherits System.Windows.Forms.Form

    Public Delegate Sub DisplayInvoker(ByVal t As String)

    Private mobjClient As TcpClient
    Private marData(1024) As Byte
    Private mobjText As New StringBuilder()

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        mobjClient = New TcpClient("example.com", 7777)
        DisplayText("Connected to host " & "example.com")

        mobjClient.GetStream.BeginRead(marData, 0, 1024, AddressOf DoRead, Nothing)
    End Sub

    Private Sub btnSend_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSend.Click
        Send(txtSend.Text)
        txtSend.Text = ""
    End Sub

    Private Sub Send(ByVal t As String)
        Dim w As New IO.StreamWriter(mobjClient.GetStream)
        w.Write(t & vbCr)
        w.Flush()
        DisplayText(vbNewLine & "Sent " & t)
    End Sub

    Private Sub DoRead(ByVal ar As IAsyncResult)
        Dim intCount As Integer
        Try
            intCount = mobjClient.GetStream.EndRead(ar)
            If intCount < 1 Then
                MarkAsDisconnected()
                Exit Sub
            End If

            BuildString(marData, 0, intCount)

            mobjClient.GetStream.BeginRead(marData, 0, 1024, AddressOf DoRead, Nothing)
        Catch e As Exception
            MarkAsDisconnected()
        End Try
    End Sub

    Private Sub BuildString(ByVal Bytes() As Byte, ByVal offset As Integer, ByVal count As Integer)
        Dim intIndex As Integer

        For intIndex = offset To offset + count - 1
            If Bytes(intIndex) = 10 Then
                mobjText.Append(vbLf)

                Dim params() As Object = {mobjText.ToString}
                Me.Invoke(New DisplayInvoker(AddressOf Me.DisplayText), params)

                mobjText = New StringBuilder()
            Else
                mobjText.Append(ChrW(Bytes(intIndex)))
            End If
        Next
    End Sub

    Private Sub MarkAsDisconnected()
        txtSend.ReadOnly = True
        btnSend.Enabled = False
        DisplayText(vbNewLine & "Dissconnected")
    End Sub

    Private Sub DisplayText(ByVal t As String)
        txtDisplay.AppendText(t)
    End Sub
End Class

1 个答案:

答案 0 :(得分:1)

只要两个应用程序都说TCP / IP,一个有一个监听服务器套接字,另一个知道该服务器套接字的IP和端口号,并且没有阻止它连接到它,不管用什么语言任何应用程序都是写入的。拥有像TCP / IP这样的协议的关键在于它实际上独立于平台,操作系统,框架,语言或其他任何东西。

至于你的代码,有一些突出的东西:

  • 每次发送任何内容时,您都会创建一个附加到网络流的新StreamWriter。如果编写器关闭并将自己置于最终化(大多数IDisposables所做的)上,它将关闭底层流(在TcpClient的流的情况下,将关闭连接)。如果您打算使用编写器发送数据,请将其作为实例变量并重复使用,而不是每次都创建一个新的。

  • 从阅读有关XmlSocket协议的内容来看,发送和接收的字符串似乎应该以空值终止。也就是说,在将数据分解为字符串时,BuildString内的循环应该寻找0而不是10,而Send应该追加一个空字符(Chr(0))而不是{ {1}}到它发送的每个字符串。

  • 你真的应该使用编码将字节转换为字符。您现有的代码(如上所述,如果已修复)至少应该显示一些数据,假设有任何要发送的数据。但是,您可能会发现数据已损坏,因为假设1个字节== 1个字符 - 这种情况很少见,因为Unicode很大。 :)我建议您使用StreamReader而不是直接从流中读取 - StreamReader在幕后使用Encoding(默认情况下为UTF-8,IIRC),并且将处理大部分血腥细节,所以你不需要担心要读取多少字节来获取char。但StreamReaders没有内置的东西来进行异步读取。你必须稍微更改你的东西,并为它生成一个线程,以便使用StreamReader。

您可以直接使用解码器,这几乎就是StreamReader的功能。使用它是这样的:

vbCr

(顺便说一句,评论开始很有趣,因此语法高亮显示不那么愚蠢。)