[英]Extending TcpClient class in C#
我正在编写服务器应用程序,我想做这样的事情:
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
参数并调用基本TcpClient
类构造函数。 我希望MyClient
成为TcpClient
而不是TcpClient
属性。 或者也许Socket类在我的情况下会更好?
干
(MyClient)listener.AcceptTcpClient();
无论你做什么都不会工作,因为它总是返回常规TcpClient
(这个方法在TcpListener
不是虚拟的,所以你不能改变它)。 与AcceptSocket
相同的故事。 您可以创建一个代理类,该代理类不会从TcpClient
继承,但会实现所有相同的公共成员,并将其实现代理到您存储在私有字段中的实际TcpClient
并传递给构造函数。 但是,您无法将该类传递给任何需要常规TcpClient
。
AcceptTcpClient
TcpClient
使用接受套接字的构造函数创建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
默认构造函数, TcpClient
会创建新的套接字(它位于上面构造函数的第一行)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.