using TouchSocket.Core; using TouchSocket.Dmtp; using TouchSocket.Dmtp.FileTransfer; using TouchSocket.Sockets; namespace Net; internal class ServerPlugin : PluginBase, IDmtpFileTransferredPlugin, IDmtpFileTransferringPlugin, ITcpConnectedPlugin, ITcpClosedPlugin { private readonly ILog m_logger; public ServerPlugin(ILog logger) { this.m_logger = logger; } /// /// 该方法,会在每个文件被请求(推送)时第一时间触发。 /// 当请求文件时,可以重新指定请求的文件路径,即对e.ResourcePath直接赋值。 /// 当推送文件时,可以重新指定保存文件路径,即对e.SavePath直接赋值。 /// /// 注意:当文件夹不存在时,需要手动创建。 /// /// /// /// public async Task OnDmtpFileTransferred(IDmtpActorObject client, FileTransferredEventArgs e) { //有可能是上传,也有可能是下载 this.m_logger.Info($"传输文件结束,请求类型={e.TransferType},文件名={e.ResourcePath},请求状态={e.Result}"); await e.InvokeNext(); } /// /// 该方法,会在每个文件被请求(推送)结束时触发。传输不一定成功,具体信息需要从e.Result判断状态。 /// 其次,该方法也不一定会被执行,例如:在传输过程中,直接断网,则该方法将不会执行。 /// /// /// /// public async Task OnDmtpFileTransferring(IDmtpActorObject client, FileTransferringEventArgs e) { //传输,但是不一定成功,甚至该方法都不一定会被触发,具体信息需要从e.Result判断状态。 this.m_logger.Info($"请求传输文件,请求类型={e.TransferType},请求文件名={e.ResourcePath}"); e.IsPermitOperation = true; //每次传输都需要设置true,表示允许传输 await e.InvokeNext(); } public async Task OnTcpConnected(ITcpSession client, ConnectedEventArgs e) { m_logger.Info($"客户端[{client.IP}]连接成功"); await e.InvokeNext(); } public async Task OnTcpClosed(ITcpSession client, ClosedEventArgs e) { m_logger.Info($"客户端[{client.IP}]断开连接"); await e.InvokeNext(); } } internal class ClientPlugin : PluginBase, ITcpConnectedPlugin, ITcpClosedPlugin { private readonly ILog m_logger; public ClientPlugin(ILog logger) { this.m_logger = logger; } public async Task OnTcpConnected(ITcpSession client, ConnectedEventArgs e) { m_logger.Info($"客户端[{client.IP}]连接成功"); await e.InvokeNext(); } public async Task OnTcpClosed(ITcpSession client, ClosedEventArgs e) { m_logger.Info($"客户端[{client.IP}]断开连接"); await e.InvokeNext(); } }