使用扩展类 tcpClient 连接到 tcpListener

Posted

技术标签:

【中文标题】使用扩展类 tcpClient 连接到 tcpListener【英文标题】:connect to a tcpListener with a extended class of tcpClient 【发布时间】:2017-01-08 22:43:07 【问题描述】:

我创建了一个继承 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?

【问题讨论】:

你有没有发现你的字段是_ClintName,而应该是_ClientName 【参考方案1】:

请注意,在您所说的有效代码中,您使用的是具有 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)

【讨论】:

谢谢,我会试试这段代码,我认为这是 99.99999% 的解决方案。 .非常感谢【参考方案2】:

感谢 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 sub 第一行出现错误:

NewClient = Listning.EndAcceptTcpClient(ar)

我应该对 tcpListener 对象或类似的东西做任何改变吗?还是我的尝试基本上是错误的?

【讨论】:

我建议您阅读 Stack Overflow 上的一些内容,以了解该站点的工作原理。您不会在答案中提出新问题。您问了一个问题,看来我的回答已经解决了您的问题。在这种情况下,您接受答案,这就是它的结束。如果出现了新问题,那么您将创建一个新问题。您不会为这个根本不是答案的问题添加答案。每个主题包含一个问题和一个或多个答案,您接受最佳答案。如果您自己解决了问题,那么您可以发布带有该解决方案的答案并接受它。

以上是关于使用扩展类 tcpClient 连接到 tcpListener的主要内容,如果未能解决你的问题,请参考以下文章

TcpClient 是单个连接使用吗?如何发送第二条消息?

如何设置 TcpClient 的超时时间?

esp32tcpclient最大传输的数据长度

C# TcpClient的Connect超时处理(Timeout)

在 C# 中使用 TcpClient 的 HTTP 客户端真的很奇怪

TcpClient 与服务器通信以保持 C# 中的活动连接?