使用扩展类tcpClient连接到tcpListener

时间:2017-01-08 22:43:08

标签: vb.net sockets networking tcpclient tcplistener

我创建了一个新类继承的TcpClient类,它具有一个名为(例如)ClientName的属性。这是这个类的定义:

Public Class MyTcpClient
    Inherits Net.Sockets.TcpClient

    Private _ClintName As String

    Sub New(ByVal host As String, ByVal port As Integer, ByVal ClientName As String)
        MyBase.New()
        _ClintName = ClientName
    End Sub

    Public Property ClientName()
        Get
            Return _ClintName
        End Get
        Set(ByVal value)
            _ClintName = value
        End Set
    End Property
End Class

我创建了这个类的一个瞬间,并尝试使用以下代码将此客户端连接到服务器(TcpListener):

Try
    client = New MyTcpClient(ip, port , "ClientName")
Catch ex As Exception
    xUpdate("Can't connect to the server!")
End Try 

但每次尝试连接服务器时,按摩都会出错: “System.InvalidOperationException:在未连接的套接字上不允许该操作。” 现在,如果我将MyTcpClient更改为Net.Socket.TcpClient,那么每件事都可以。

Try
    client = New Net.Socket.TcpClient(ip, port)
Catch ex As Exception
    xUpdate("Can't connect to the server!")
End Try

有没有办法像我的类一样使用扩展类TcpClient连接到TcpListener?

2 个答案:

答案 0 :(得分:0)

请注意,在您说的代码中,您正在使用具有IP地址和端口号参数的TcpClient构造函数。现在看看你的派生类定义。它是否使用该构造函数?不,它没有。它使用没有参数的构造函数。该构造函数未连接,因为它不知道要连接到什么。如果您希望您的派生类连接,那么您必须让它调用实际连接的方法。显而易见的解决方案是改变这一点:

Sub New(ByVal host As String, ByVal port As Integer, ByVal ClientName As String)
    MyBase.New()

到此:

Sub New(ByVal host As String, ByVal port As Integer, ByVal ClientName As String)
    MyBase.New(host, port)

答案 1 :(得分:-1)

谢谢jmcilhinney ....

我测试了你的代码,所以现在我的第一个错误被删除了,但是在服务器端出现了新的错误。错误消息是: “无法将'System.Net.Sockets.TcpClient'类型的对象强制转换为'ServerChat.MyTcpClient'。”

服务器端的代码是:

Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load
    Dim NewClient As MyTcpClient
    Listning = New TcpListener(GetMyIP, 3818)
    Listning.Start()
    UpdateList("Server Starting", False)
    Listning.BeginAcceptTcpClient(New AsyncCallback(AddressOf AcceptClient), Listning)
End Sub

Sub AcceptClient(ByVal ar As IAsyncResult)
    NewClient = Listning.EndAcceptTcpClient(ar)
    UpdateList("New Client Joined!", True)
    Listning.BeginAcceptTcpClient(New AsyncCallback(AddressOf AcceptClient), Listning)
End Sub

第一行的AcceptClient子中的错误occue:

NewClient = Listning.EndAcceptTcpClient(ar)

我应该对tcpListener对象做什么改变吗?或者我的尝试基本上是错的?