我正在尝试为TCP连接中的服务器创建GUI。我希望有一个按钮来创建连接,可能还有一个底层流,然后有其他按钮在这个流上发送序列化的命令。我遇到了问题,因为每个按钮都充当子过程,所以我认为流在作用域之外,对每个按钮都不可用。
我已经尝试在按钮之外创建流,但是下面的代码在myServer.Start()
抛出一个错误,说myServer没有声明。
Public Class Form1
Dim myIP As IPAddress = IPAddress.Parse("my ip")
Dim myServer As New TcpListener(myIP, 800)
myServer.Start() 'Error line
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Stream Write Stuff
End Sub
End Class
我也试过在每次按下按钮开始时收听,但在连接后,一旦myServer.Start()
无限期暂停,同时收听不来的连接尝试。
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
myServer.Start()
Dim myClient As TcpClient = myServer.AcceptTcpClient()
Dim myStream As NetworkStream = myClient.GetStream
myStream.Write(xxx)
End Sub
我如何创建一个连接和流,是可用的所有按钮,我将添加到GUI?
How can I create a connection and stream that is available to all the buttons I would add to the GUI?
Public Class Form1
' just declare the variables
Private myIP As IPAddress
Private myServer As TcpListener
Private myStream As NetworkStream
Sub btnStart_Click(...
' create the objects when you need them
myIP = IPAddress.Parse("my ip")
myServer = New TcpListener(...)
myStream = myClient.GetStream
声明一个对象变量和创建它的实例是两件不同的事情。你同时在做这两件事:
Dim myServer As New TcpListener(...)
Dim
部分声明变量(Private
| Friend
| Public
)。New
关键字创建一个实例;在使用一个对象之前,你需要同时做这两件事,但它们不必同时做。长格式更清楚地表明有两部分:
Dim myServer As TcpListener = New TcpListener(...)
声明变量的决定了变量的作用域。子程序中的任何内容都只具有过程级作用域。它不会存在于这个过程之外。myIP
、myServer
和myStream
在任何过程的顶部声明,将在该形式的任何地方可用。
一旦它们被声明,你就可以创建一个实例,如上面btnStart_Click
(或Form Load等)所示。
也有块范围涉及结构,如If/End If
, Using/End Using
和For Each/Next
。其中声明的变量的作用域仅限于该块:
If cr IsNot Nothing Then
Dim temp As Decimal = cr.Total
End If
lblTotal.Text = temp ''temp' is not declared. It may be inaccessible
最后一行将是一个错误,因为temp
是在一个局部块中声明的(Dim
),所以它不存在于局部块之外。这将适用于If/End If
、Using/End Using
和For Each/Next
——基本上,任何导致缩进的内容都会创建一个局部块。
参见:
Visual Basic中的作用域