我正在尝试使用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
答案 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
(顺便说一句,评论开始很有趣,因此语法高亮显示不那么愚蠢。)