C# 在C中扩展TcpClient类#
我正在编写服务器应用程序,我想这样做:C# 在C中扩展TcpClient类#,c#,.net,C#,.net,我正在编写服务器应用程序,我想这样做: class MyClient : TcpClient { public StreamReader Reader { get; } public StreamWriter Writer { get; } public MyClient() { Reader = new StreamReader(this.GetStream()); Writer = new StreamW
class MyClient : TcpClient
{
public StreamReader Reader { get; }
public StreamWriter Writer { get; }
public MyClient()
{
Reader = new StreamReader(this.GetStream());
Writer = new StreamWriter(this.GetStream());
}
}
然后我要侦听传入连接并创建MyClient
对象:
TcpListener listener= new TcpListener(IPAddress.Parse(Constants.IpAddress), Constants.Port);
MyClient client = (MyClient)listener.AcceptTcpClient();
我知道我不能这样沮丧(TcpClient
不是MyClient
)。
但是MyClient
是TcpClient
,那么我需要做什么来完成这样的场景呢?
创建一个MyClient
构造函数,该构造函数接受TcpClient
参数并调用baseTcpClient
类构造函数。我希望MyClient
成为TcpClient
而不是TcpClient
属性。或者Socket类在我的情况下会更好?做什么
(MyClient)listener.AcceptTcpClient();
无论您做什么,它都不会工作,因为它总是返回常规的TcpClient
(并且此方法在TcpListener
中不是虚拟的,因此您无法更改它)。与AcceptSocket
的情况相同。您可以创建一个代理类,该类不会从TcpClient
继承,但将实现所有相同的公共成员,并将其实现代理到存储在private字段中并传递给构造函数的realTcpClient
。但是,您不能将该类传递给任何需要常规TcpClient
的方法
AcceptTcpClient
的实现使用接受套接字的构造函数创建TcpClient
,但是此构造函数是内部的,因此不能使用这种方法
我想到的另一个选择是:
class MyClient : TcpClient
{
public StreamReader Reader { get; }
public StreamWriter Writer { get; }
public MyClient(Socket acceptedSocket)
{
this.Client.Dispose();
this.Client = acceptedSocket;
this.Active = true;
Reader = new StreamReader(this.GetStream());
Writer = new StreamWriter(this.GetStream());
}
}
然后将套接字从
AcceptSocket
传递给构造函数。但是我不喜欢它,因为TcpClient
的默认构造函数将被调用,这将创建新的套接字(在上面构造函数的第一行处理)。我也不喜欢这个默认构造函数,但它仍然是解决我问题的一个很好的方法。谢谢:)P.S是否需要设置活动属性?@KarolŻurowski是的。