我如何创建一个TCP连接和流,可以被GUI中的所有按钮使用



我正在尝试为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(...)

声明变量的决定了变量的作用域。子程序中的任何内容都只具有过程级作用域。它不会存在于这个过程之外。myIPmyServermyStream在任何过程的顶部声明,将在该形式的任何地方可用。

一旦它们被声明,你就可以创建一个实例,如上面btnStart_Click(或Form Load等)所示。

也有块范围涉及结构,如If/End If, Using/End UsingFor 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 IfUsing/End UsingFor Each/Next——基本上,任何导致缩进的内容都会创建一个局部块。

参见:

Visual Basic中的作用域

相关内容

  • 没有找到相关文章

最新更新