📄 mytcp.frm
字号:
Dim itemx As Object
'停止服务器端侦听
sockServer(0).Close
cmdListen.Enabled = True
cmdCloseListen.Enabled = False
Set itemx = lstStates.ListItems.Item(2)
itemx.SubItems(2) = "-1"
End Sub
Private Sub cmdConnect_Click()
' 客户端程序连接服务器
'
sockClient.LocalPort = 0
sockClient.RemoteHost = txtServerName.Text
sockClient.RemotePort = CInt(txtPort.Text)
sockClient.Connect
cmdConnect.Enabled = False
End Sub
Private Sub cmdDisconnect_Click()
Dim itemx As Object
'关闭客户端连接
'
sockClient.Close
cmdConnect.Enabled = True
cmdSendData.Enabled = False
cmdDisconnect.Enabled = False
' 设定端口号为-1表示没有连接
'
Set itemx = lstStates.ListItems.Item(1)
itemx.SubItems(2) = "-1"
End Sub
Private Sub cmdExit_Click()
Unload Me
End Sub
Private Sub cmdListen_Click()
Dim itemx As Object
' 将服务器端控件设置为侦听模式
'
sockServer(0).LocalPort = CInt(txtServerPort.Text)
sockServer(0).Listen
Set itemx = lstStates.ListItems.Item(2)
itemx.SubItems(2) = sockServer(0).LocalPort
cmdCloseListen.Enabled = True
cmdListen.Enabled = False
End Sub
Private Sub cmdSendData_Click()
' 如果连接成功,则发送数据到服务器
'
If (sockClient.State = sckConnected) Then
sockClient.SendData txtSendData.Text
Else
MsgBox "以外错误,连接关闭!"
Call cmdDisconnect_Click
End If
End Sub
Private Sub Form_Load()
Dim itemx As Object
lblLocalHostname.Caption = sockServer(0).LocalHostName
lblLocalHostIP.Caption = sockServer(0).LocalIP
' 初始化协议,设定为TCP协议
'
ServerIndex = 0
sockServer(0).Protocol = sckTCPProtocol
sockClient.Protocol = sckTCPProtocol
' 设置按钮相关属性
'
cmdDisconnect.Enabled = False
cmdSendData.Enabled = False
cmdCloseListen.Enabled = False
' 初始化ListView控件,让她包含目前所有winsock控件的状态
'
Set itemx = lstStates.ListItems.Add(1, , "Local Client")
itemx.SubItems(1) = "sckClosed"
itemx.SubItems(2) = "-1"
Set itemx = lstStates.ListItems.Add(2, , "Local Server")
itemx.SubItems(1) = "sckClosed"
itemx.SubItems(2) = "-1"
' 初始化定时器,它控制状态的刷新
'
Timer1.Interval = 500
Timer1.Enabled = True
End Sub
Private Sub sockClient_Close()
sockClient.Close
End Sub
Private Sub sockClient_Connect()
Dim itemx As Object
' 如果连接成功,则使得按钮发送数据可以使用
cmdSendData.Enabled = True
cmdDisconnect.Enabled = True
Set itemx = lstStates.ListItems.Item(1)
itemx.SubItems(2) = sockClient.LocalPort
End Sub
Private Sub sockClient_Error(ByVal Number As Integer, _
Description As String, ByVal Scode As Long, _
ByVal Source As String, ByVal HelpFile As String, _
ByVal HelpContext As Long, CancelDisplay As Boolean)
' 客户端连接出现错误的时候,弹出错误信息
' 并关闭连接
MsgBox Description
sockClient.Close
cmdConnect.Enabled = True
End Sub
Private Sub sockServer_Close(index As Integer)
Dim itemx As Object
' 关闭控件
'
sockServer(index).Close
Set itemx = lstStates.ListItems.Item(index + 2)
lstStates.ListItems.Item(index + 2).Text = "---.---.---.---"
itemx.SubItems(2) = "-1"
End Sub
Private Sub sockServer_ConnectionRequest(index As Integer, _
ByVal requestID As Long)
Dim i As Long, place As Long, freeSock As Long, itemx As Object
' 寻找是否有空闲的关闭Winsock控件可以使用
'
freeSock = 0
For i = 1 To ServerIndex
If sockServer(i).State = sckClosed Then
freeSock = i
Exit For
End If
Next i
' 如果没有空闲的控件,则重新创建一个新的winsock
' so load a new one
'
If freeSock = 0 Then
ServerIndex = ServerIndex + 1
Load sockServer(ServerIndex)
sockServer(ServerIndex).Accept requestID
place = ServerIndex
Else
sockServer(freeSock).Accept requestID
place = freeSock
End If
' 在ListView中增加新winsock控件的状态
'
If freeSock = 0 Then
Set itemx = lstStates.ListItems.Add(, , _
sockServer(ServerIndex).RemoteHostIP)
Else
Set itemx = lstStates.ListItems.Item(freeSock + 2)
lstStates.ListItems.Item(freeSock + 2).Text = _
sockServer(freeSock).RemoteHostIP
End If
itemx.SubItems(2) = sockServer(place).RemotePort
End Sub
Private Sub sockServer_DataArrival(index As Integer, _
ByVal bytesTotal As Long)
Dim data As String, entry As String
' 创建一个大的缓冲区以存放数据
'
data = String(bytesTotal + 2, Chr$(0))
sockServer(index).GetData data, vbString, bytesTotal
'
entry = sockServer(index).RemoteHostIP & ": " & data
lstMessages.AddItem entry
End Sub
Private Sub sockServer_Error(index As Integer, _
ByVal Number As Integer, Description As String, _
ByVal Scode As Long, ByVal Source As String, _
ByVal HelpFile As String, ByVal HelpContext As Long, _
CancelDisplay As Boolean)
' 错误处理
MsgBox Description
sockServer(index).Close
End Sub
Private Sub Timer1_Timer()
Dim i As Long, index As Long, itemx As Object
' 定时刷新各个winsock控件的状态
'
Set itemx = lstStates.ListItems.Item(1)
Select Case sockClient.State
Case sckClosed
itemx.SubItems(1) = "sckClosed"
Case sckOpen
itemx.SubItems(1) = "sckOpen"
Case sckListening
itemx.SubItems(1) = "sckListening"
Case sckConnectionPending
itemx.SubItems(1) = "sckConnectionPending"
Case sckResolvingHost
itemx.SubItems(1) = "sckResolvingHost"
Case sckHostResolved
itemx.SubItems(1) = "sckHostResolved"
Case sckConnecting
itemx.SubItems(1) = "sckConnecting"
Case sckConnected
itemx.SubItems(1) = "sckConnected"
Case sckClosing
itemx.SubItems(1) = "sckClosing"
Case sckError
itemx.SubItems(1) = "sckError"
Case Else
itemx.SubItems(1) = "unknown: " & sockClient.State
End Select
' 当有客户连接时,设置服务器端状态
'
index = 0
For i = 2 To ServerIndex + 2
Set itemx = lstStates.ListItems.Item(i)
Select Case sockServer(index).State
Case sckClosed
itemx.SubItems(1) = "sckClosed"
Case sckOpen
itemx.SubItems(1) = "sckOpen"
Case sckListening
itemx.SubItems(1) = "sckListening"
Case sckConnectionPending
itemx.SubItems(1) = "sckConnectionPending"
Case sckResolvingHost
itemx.SubItems(1) = "sckResolvingHost"
Case sckHostResolved
itemx.SubItems(1) = "sckHostResolved"
Case sckConnecting
itemx.SubItems(1) = "sckConnecting"
Case sckConnected
itemx.SubItems(1) = "sckConnected"
Case sckClosing
itemx.SubItems(1) = "sckClosing"
Case sckError
itemx.SubItems(1) = "sckError"
Case Else
itemx.SubItems(1) = "unknown"
End Select
index = index + 1
Next i
End Sub
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -