使用扩展 class 的 tcpClient 连接到 tcpListener
connect to a tcpListener with a extended class of tcpClient
我创建了一个新的 class 继承的 TcpClient class,它有一个 属性 命名(例如) ClientName 。这是 class 的定义:
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
我创建了一个 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
有什么方法可以像我的 class 那样使用扩展的 class TcpClient 连接到 TcpListener?
请注意,在您所说的有效代码中,您使用的是具有 IP 地址和端口号参数的 TcpClient
构造函数。现在看看您派生的 class 定义。它使用那个构造函数吗?不,它没有。它使用不带参数的构造函数。该构造函数不连接,因为它不知道要连接到什么。如果您希望您的派生 class 连接,那么您必须让它调用一个实际连接的方法。显而易见的解决方案是改变这个:
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)
感谢 jmcilhinney ....
我测试了你的代码,所以现在我的第一个错误被删除了,但是在服务器端出现了一个新的错误。错误信息是:
"Unable to cast object of type 'System.Net.Sockets.TcpClient' to type '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 对象或类似的对象做任何更改吗?或者我的尝试基本上是错误的?
我创建了一个新的 class 继承的 TcpClient class,它有一个 属性 命名(例如) ClientName 。这是 class 的定义:
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
我创建了一个 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
有什么方法可以像我的 class 那样使用扩展的 class TcpClient 连接到 TcpListener?
请注意,在您所说的有效代码中,您使用的是具有 IP 地址和端口号参数的 TcpClient
构造函数。现在看看您派生的 class 定义。它使用那个构造函数吗?不,它没有。它使用不带参数的构造函数。该构造函数不连接,因为它不知道要连接到什么。如果您希望您的派生 class 连接,那么您必须让它调用一个实际连接的方法。显而易见的解决方案是改变这个:
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)
感谢 jmcilhinney ....
我测试了你的代码,所以现在我的第一个错误被删除了,但是在服务器端出现了一个新的错误。错误信息是: "Unable to cast object of type 'System.Net.Sockets.TcpClient' to type '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 对象或类似的对象做任何更改吗?或者我的尝试基本上是错误的?