2017-01-08 14 views
0

ClientNameという名前のプロパティを持つ新しいクラス継承TcpClientクラスを作成しました。ここでは、このクラスの定義です:は、tcpClientの拡張クラスを持つtcpListenerに接続します。

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

しかし、私は接続しようとするたびに:私はこのクラスの瞬間を作成し、以下のコードを使用してサーバ(TcpListener)にこのクライアントを接続しようとした

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 

サーバーに次のエラーメッセージが表示されます。 "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に接続する方法はありますか?

+0

フィールドが '_ClientName'である必要がある場合、フィールドは' _ClintName'です。 – jmcilhinney

答えて

-1

おかげで今の私の最初のエラーが削除されますが、上:これに

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

:明白な解決策は、これを変更することですサーバー側で新しいエラーが発生します。エラーメッセージは次のとおりです。 "'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) 

iはtcpListenerオブジェクトまたはそのような何かに変更すればよいですか?または私の試みは基本的に間違っていますか?

+0

私はあなたがこのサイトの仕組みを学ぶためにStack Overflowでいくつかの読書をすることをお勧めします。あなたは答えに新しい質問をしません。あなたは質問をしました。私の答えがあなたの問題を解決したようです。その場合、あなたは答えを受け入れ、それはそれの終わりです。新しい問題が発生した場合は、新しい質問を作成します。答えではないこの質問への回答は追加しません。各スレッドには1つの質問と1つ以上の回答が含まれ、最良の回答を受け入れます。あなた自身で問題を解決するなら、その解決策を使って回答を投稿し、それを受け入れます。 – jmcilhinney

0

あなたが働くコードでは、IPアドレスとポート番号のパラメータを持つTcpClientコンストラクタを使用していることに注意してください。次に、派生クラスの定義を見てください。そのコンストラクタを使用していますか?いいえ、そうではありません。パラメータなしのコンストラクタを使用します。そのコンストラクタは、何を接続するのか分からないために接続しません。派生クラスが接続することを期待するなら、実際に接続するメソッドを呼び出さなければなりません。 、

は、私はあなたのコードをテストした.... jmcilhinney

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

ありがとう、私はこのコードを試してみます、私はこれが99.99999%のソリューションだと思います。 。ありがとうございました –

関連する問題