提示“在其上下文中,该请求的地址无效,System”,请高手帮忙。
运行以下代码正常,但点BTN开启SOCKET服务候提示“在其上下文中,该请求的地址无效,System”,请问这是什么问题?
谢谢!
Imports System.Net
Imports System.Net.Sockets
Imports System.Threading
Imports System.Text
Public Class Form1
Private objSocketServer As SocketServer
Public Sub New()
objSocketServer = New SocketServer()
' 此调用是 Windows 窗体设计器所必需的。
InitializeComponent()
' 在 InitializeComponent() 调用之后添加任何初始化。
End Sub
Private Sub BTN_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BTN.Click
objSocketServer.BindIP = txtIP.Text.Trim()
objSocketServer.BindPort = Integer.Parse(txtPort.Text)
objSocketServer.Run()
End Sub
Private Sub BTNStop_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BTNStop.Click
objSocketServer.StopRun()
End Sub
End Class
Public Class SocketServer
Private m_BindIp As String
Private m_BindPort As String
Private RunState As Boolean
Private aryClientList As ArrayList
Private SckServer As Socket
Private Done As ManualResetEvent
Public Sub New()
m_BindIp = ""
m_BindPort = 0
RunState = False
aryClientList = New ArrayList()
Done = New ManualResetEvent(False)
End Sub
Public Property BindIP() As String
Get
Return m_BindIp
End Get
Set(ByVal value As String)
m_BindIp = value
End Set
End Property
Public Property BindPort() As Integer
Get
Return m_BindIp
End Get
Set(ByVal value As Integer)
m_BindIp = value
End Set
End Property
Public Sub StopRun()
RunState = False
SckServer.Close()
End Sub
Public Sub Run()
Dim ipLocal As IPAddress
Dim intListenPort As Integer
Dim ipepServer As IPEndPoint
ipLocal = IPAddress.Parse(m_BindIp.Trim())
intListenPort = m_BindPort
ipepServer = New IPEndPoint(ipLocal, intListenPort)
SckServer = New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
Try
SckServer.Bind(ipepServer)
SckServer.Listen(100)
Dim thdAccept As New Thread(AddressOf ThreadBeginAccept)
thdAccept.Start()
Catch ex As Exception
MessageBox.Show("错误描述" & ex.Message & vbCrLf & "错误源" & ex.Source, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error)
Exit Sub
End Try
End Sub
Private Sub ThreadBeginAccept()
RunState = True
Do
Done.Reset()
SckServer.BeginAccept(New AsyncCallback(AddressOf OnConnectionRequest), SckServer)
Done.WaitOne()
Loop While RunState = True
End Sub
Private Sub OnConnectionRequest(ByVal ar As IAsyncResult)
Done.Set()
Dim Listener As Socket = CType(ar.AsyncState, Socket)
NewConnection(Listener.EndAccept(ar))
Listener.BeginAccept(New AsyncCallback(AddressOf OnConnectionRequest), Listener)
End Sub
Private Sub NewConnection(ByVal sckClient As Socket)
Dim objSocketClient As New SocketClient(sckClient)
Debug.Print(objSocketClient.Sock.RemoteEndPoint.ToString() & "已经连接" & vbCrLf)
aryClientList.Add(objSocketClient)
objSocketClient.ReceiveCallback(Me)
End Sub
Public Sub OnReceiveData(ByVal ar As IAsyncResult)
Dim objSocketClient As SocketClient
objSocketClient = CType(ar.AsyncState, SocketClient)
Dim bytReceiveData() As Byte = objSocketClient.GetReceiveData(ar)
'判断远程客户端是否断开连接
If bytReceiveData.Length < 1 Then
Debug.Print(objSocketClient.Sock.RemoteEndPoint.ToString() & "已经断开" & vbCrLf)
objSocketClient.Sock.Close()
aryClientList.Remove(objSocketClient)
Exit Sub
End If
Dim x As String = Encoding.ASCII.GetString(bytReceiveData).Trim()
Debug.Print(vbCrLf & "接受数据" & x & vbCrLf)
If Left(x, x.Length) = "123456" Then
Dim SendBuff() As Byte = Encoding.ASCII.GetBytes("567890".ToCharArray())
objSocketClient.Sock.Send(SendBuff, SendBuff.Length, SocketFlags.None)
End If
objSocketClient.ReceiveCallback(Me)
End Sub
End Class
Public Class SocketClient
Private m_sock As Socket
Private RecvBuff(256) As Byte
Public Sub New(ByVal sckSock As Socket)
m_sock = sckSock
End Sub
Public ReadOnly Property Sock() As Socket
Get
Return m_sock
End Get
End Property
Public Sub ReceiveCallback(ByVal objSocketServer As SocketServer)
Dim ReceiveData As AsyncCallback
Try
ReceiveData = New AsyncCallback(AddressOf objSocketServer.OnReceiveData)
m_sock.BeginReceive(RecvBuff, 0, RecvBuff.Length, SocketFlags.None, ReceiveData, Me)
Catch ex As Exception
End Try
End Sub
Public Function GetReceiveData(ByVal ar As IAsyncResult) As Byte()
Dim intByteLen As Integer
Dim bytReturn As Byte()
intByteLen = 0
Try
intByteLen = m_sock.EndReceive(ar)
Catch ex As Exception
End Try
ReDim bytReturn(intByteLen - 1)
Array.Copy(RecvBuff, bytReturn, intByteLen)
Return bytReturn
End Function
End Class