VB.NET TCP服务器只能发送一次消息,接收正常,望各位前辈给予指点谢谢!

xistrue 2015-09-28 11:23:49
VB.NET TCP服务器只能发送一次消息,接收正常,望各位前辈给予指点谢谢!
 Dim m_aryClients As New ArrayList
Dim mServer As Socket
Delegate Sub AddClientToList(ByVal strName As String)
Delegate Sub AddRecvToText(ByVal strName As String)
Delegate Sub DeletClientFromList(ByVal strName As String)
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim addr As IPAddress = IPAddress.Parse("127.0.0.1")
For Each ipaddr As IPAddress In Dns.GetHostEntry(Dns.GetHostName()).AddressList
If ipaddr.ToString.StartsWith("192") Then
addr = ipaddr
Exit For
End If
Next
mServer = New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp) '使用指定的地址族、套接字类型和协议初始化 Socket 类的新实例。
mServer.Bind(New IPEndPoint(addr, Int32.Parse(TextBox1.Text))) '使 System.Net.Sockets.Socket 与一个本地终结点相关联
mServer.Listen(100) '将 System.Net.Sockets.Socket 置于侦听状态
mServer.BeginAccept(AddressOf OnAccepted, mServer) '开始一个异步操作来接受一个传入的连接尝试
'Public Function BeginAccept(ByVal callback As System.AsyncCallback, ByVal state As Object) As System.IAsyncResult

End Sub
Protected Overridable Sub OnAccepted(ByVal ar As IAsyncResult) 'IAsyncResult(表示异步操作的状态)
Dim listener As Socket = CType(ar.AsyncState, Socket)
' End the operation.
Dim handler As Socket = listener.EndAccept(ar)
m_aryClients.Add(handler)
AddClientToListBox(handler.RemoteEndPoint.ToString()) 'RemoteEndPoint(获取远程终结点)
Dim state As New StateObject
state.workSocket = handler
mServer.BeginAccept(AddressOf OnAccepted, mServer)
handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, New AsyncCallback(AddressOf ReadCallback), state) '开始从连接的 System.Net.Sockets.Socket 中异步接收数据
End Sub
Protected Overridable Sub ReadCallback(ByVal ar As IAsyncResult)
Dim content As String = String.Empty
Dim state As StateObject = CType(ar.AsyncState, StateObject)
Dim handler As Socket = state.workSocket

Dim bytesRead As Integer = 0
Try
bytesRead = handler.EndReceive(ar)
Catch ex As Exception
ToolStripStatusLabel1.Text = "客户端:" & handler.RemoteEndPoint.ToString & "强制关闭了!"
End Try
If bytesRead = 0 Then
DeleteClientFromListBox(handler.RemoteEndPoint.ToString())
m_aryClients.Remove(handler)
handler.Close()
Return
End If
AddRecvToTextBox(Encoding.ASCII.GetString(state.buffer))
handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, New AsyncCallback(AddressOf ReadCallback), state)
End Sub 'ReadCallback

以下是发送代码
Dim barrSend As Byte() = Encoding.ASCII.GetBytes(TextBox3.Text)
For Each clientSend As Socket In m_aryClients
clientSend.Send(barrSend)
Next clientSend

,接收都正常的,这个程序是不是接收的进程创建了,而发送的进程没有被创建,
handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, New AsyncCallback(AddressOf ReadCallback), state) '开始从连接的 System.Net.Sockets.Socket 中异步接收数据
但是令我疑惑的是发送也能发送一次的,第二次就发送不出去了,这个机制和原理没有理解进去。
...全文
176 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
本拉灯 2015-09-29
  • 打赏
  • 举报
回复
NO,这种做法,行不通,你还是用第三方的吧FastSocket
xistrue 2015-09-29
  • 打赏
  • 举报
回复
不好意思,是客户端的问题,还有个问题想问,这种架构下,如果发送接收文件,数据大于缓存的可以吗

16,549

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧