2017-01-08 3 views
0

Ich habe eine neue Klasse geerbt TcpClient-Klasse erstellt, die eine Eigenschaft namens (zum Beispiel) ClientName hat. hier ist die Definition dieser Klasse:Verbinden mit einem TCPListener mit einer erweiterten Klasse von TCP-Client

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 

ich einen Augenblick dieser Klasse erstellt und versuchte, diesen Client zu einem Server (TcpListener) mit folgendem Code zu verbinden:

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

Aber jedes Mal, wenn ich versuche, eine Verbindung Beim Server tritt ein Fehler bei dieser Massage auf: "System.InvalidOperationException: Der Vorgang ist bei nicht verbundenen Sockets nicht erlaubt." Nun, wenn ich MyTcpClient in Net.Socket.TcpClient ändere, wird alles in Ordnung sein.

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

Gibt es eine Möglichkeit zu einem TcpListener mit einer erweiterten Klasse von TcpClient wie meine Klasse zu verbinden?

+0

Haben Sie zufällig festgestellt, dass Ihr Feld '_ClintName' ist, wenn es' _ClientName' sein sollte? – jmcilhinney

Antwort

-1

dank jmcilhinney ....

i Code getestet, so dass nun mein erster Fehler entfernt wird, sondern auf Auf der Serverseite tritt ein neuer Fehler auf. Die Fehlermeldung lautet: "Darf das Objekt des Typs 'System.Net.Sockets.TcpClient' nicht in den Typ 'ServerChat.MyTcpClient' umwandeln."

der Code in Server-Seite ist:

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 

der Fehler occue in AcceptClient Unter auf der ersten Zeile:

NewClient = Listning.EndAcceptTcpClient(ar) 

sollte ich tun, um jede Änderung auf TcpListener Objekt oder so etwas? oder ist mein Versuch grundsätzlich falsch?

+0

Ich schlage vor, dass Sie etwas über Stack Overflow lesen, um zu erfahren, wie diese Website funktioniert. Sie stellen keine neue Frage in einer Antwort. Sie haben eine Frage gestellt und es scheint, dass meine Antwort Ihr Problem gelöst hat. In diesem Fall akzeptierst du die Antwort und das ist das Ende davon. Wenn ein neues Problem aufgetreten ist, erstellen Sie eine neue Frage. Sie fügen dieser Frage keine Antwort hinzu, die überhaupt keine Antwort ist. Jeder Thread enthält eine Frage und eine oder mehrere Antworten und Sie akzeptieren die beste Antwort. Wenn Sie das Problem selbst lösen, posten Sie eine Antwort mit dieser Lösung und akzeptieren Sie sie. – jmcilhinney

0

Beachten Sie, dass Sie in dem Code, den Sie sagen, funktioniert, verwenden Sie den TcpClient-Konstruktor, der Parameter für IP-Adresse und Portnummer hat. Sehen Sie sich nun Ihre abgeleitete Klassendefinition an. Benutzt es diesen Konstruktor? Nein, tut es nicht. Es verwendet den Konstruktor ohne Parameter. Dieser Konstruktor verbindet sich nicht, weil er nicht weiß, worüber er sich verbinden soll. Wenn Sie erwarten, dass Ihre abgeleitete Klasse eine Verbindung herstellt, müssen Sie eine Methode aufrufen, die tatsächlich eine Verbindung herstellt. Die offensichtliche Lösung ist, dies zu ändern:

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

dazu:

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

Danke, ich werde diesen Code versuchen, ich denke, das ist die Lösung in 99,99999%. . Vielen Dank –

Verwandte Themen