我需要创建一个需要从外部终端预订设备检索数据到我的应用程序的应用程序,使用telnet连接并在txtOutput文本框中显示它。
我是VB的新手,并花了一些时间来学习该语言的基础知识。
首先,我创建了一个标准EXE项目,并将Winsock控件添加到表单中。 我对我想要连接的IP地址发出ping请求并且它有效。
然后我想向外部设备发送命令。我希望预订终端给我反馈txtOutput供我阅读。
我建立了连接,并且尽可能多地看到,我确实将消息发送到终端。但是我没有收到任何回复!在我的txtOutput上没有查看任何内容。
怎么可能?
这是我的代码:
Dim IPAddress As String
Dim PortNum As Integer
Private Sub cmdConnect_Click()
Winsock.Close
Winsock.RemoteHost = txtIpaddress.Text
IPAddress = Winsock.RemoteHost
PortNum = CStr(txtPortnr.Text)
If (Val(PortNum) > 65535) Then
Winsock.RemotePort = (Val(PortNum) - 65535)
PortNum = Winsock.RemotePort
Else
Winsock.RemotePort = Val(PortNum)
PortNum = Winsock.RemotePort
End If
Winsock.Connect
Module1.send_to_buffer ("Attempting connection to: " & IPAddress & ":" & CStr(PortNum))
Call wsock_status
End Sub
Private Sub Winsock_Connect()
Module1.send_to_buffer ("Succeeded connection to: " & IPAddress & ":" & CStr(PortNum))
txtSend.SetFocus
End Sub
Private Sub cmdSend_Click()
Dim strSData As String
Dim message_to_send As String
If (Winsock.State = 0) Then
Module1.send_to_buffer ("You need to connect first!")
txtSend.Text = ""
Else
strSData = txtSend.Text
Winsock.SendData strSData & vbCrLf
message_to_send = txtSend.Text
If (message_to_send <> "") Then
Winsock.SendData message_to_send & vbCrLf
Module1.send_to_buffer_norm (txtSend.Text)
txtSend.Text = ""
txtSend.SetFocus
Else
Module1.send_to_buffer ("Nothing to send!")
txtSend.Text = ""
txtSend.SetFocus
End If
End If
End Sub
Private Sub terminalConnector_DataArrival(ByVal bytesTotal As Long)
Dim strData As String
Winsock.GetData strData
If (Len(txtOutput.Text) = 0) Then
txtOutput.Text = strData & vbCrLf
Else
txtOutput.Text = txtOutput.Text & strData & vbCrLf
End If
End Sub
Private Sub cmdDisconnect_Click()
Dim Counter As Long
If (Winsock.State <> 0) Then
Winsock.Close
Call wsock_status
Module1.send_to_buffer ("Connection to " & IPAddress & ":" & CStr(PortNum) & " closed.")
End If
End Sub
Private Sub Winsock_Close()
Module1.send_to_buffer ("Disconnected from: " & IPAddress & ":" & CStr(PortNum))
Winsock.Close
End Sub
和Module1代码:
Public Function send_to_buffer(text_to_display As String)
If (Len(terminalConnector.txtOutput.Text) = 0) Then
terminalConnector.txtOutput.Text = "*** " & text_to_display
Else
terminalConnector.txtOutput.Text = terminalConnector.txtOutput.Text & vbCrLf & "*** " & text_to_display & vbCrLf & vbCrLf
End If
End Function
Public Function send_to_buffer_norm(text_to_input As String)
If (Len(terminalConnector.txtOutput.Text) = 0) Then
terminalConnector.txtOutput.Text = "> " & text_to_input & vbCrLf
Else
terminalConnector.txtOutput.Text = terminalConnector.txtOutput.Text & "> " & text_to_input & vbCrLf
End If
End Function
提前致谢
答案 0 :(得分:0)
您发送例行程序错误:
Private Sub cmdSend_Click()
Dim strSData As String
txtSend.Text = strSData
Winsock.SendData strSData
End Sub
你在txtSend中显示strSata ...而strSData仍然是一个空字符串..之后你通过Winsock控件发送空字符串
你可能意味着:Private Sub cmdSend_Click()
Dim strSData As String
strSData = txtSend.Text
Winsock.SendData strSData
End Sub
将txtSend.Text读入您的字符串变量,然后通过Winsock控件发送
服务器可能需要在字符串末尾添加一些特殊字符,所以不要忘记添加...通常你必须添加一个cariage返回:
strSData = strSData & vbCr
答案 1 :(得分:0)
DataArrival事件名称错误:
你的代码中的是:
Private Sub terminalConnector_DataArrival(ByVal bytesTotal As Long)
但它应该是你的winsock控件的名称:
Private Sub Winsock_DataArrival(ByVal bytesTotal As Long)
您始终可以在IDE中代码窗口左上方的组合框中选择控制名称,然后在IDE中代码窗口右上方的组合框中选择事件名称,这将显示事件代码的大纲在你的代码窗口中。
或者你可以双击IDE中设计窗口上的控件,它将带你进入代码窗口并在代码窗口中输入事件代码的轮廓..然后你可以选择你想要的事件代码窗口右上方的组合框
旁注:Winsock
可能不是winsock控件的最佳名称,最好给它一个更独特的名称,这可以像wskConnection
或{{1}一样简单}
当您下载MZ-tools时,您可以“查看源代码”,它将显示您的程序中不会调用或使用的任何过程和变量...这通常会为错误命名的变量提供额外的提示或程序