/// <summary>异步多次发送数据</summary> /// <param name="session">会话</param> /// <param name="pk">数据包</param> /// <param name="times">次数</param> /// <param name="msInterval">间隔</param> /// <returns></returns> public static Boolean SendMulti(this ISocketRemote session, Packet pk, Int32 times, Int32 msInterval) { if (times <= 1) { session.Send(pk); return(true); } if (msInterval < 10) { for (var i = 0; i < times; i++) { session.Send(pk); } return(true); } var timer = new TimerX(s => { session.Send(pk); // 如果次数足够,则把定时器周期置空,内部会删除 var t = s as TimerX; if (--times <= 0) { t.Period = 0; } }, null, 0, msInterval); return(true); }
/// <summary>发送数据流</summary> /// <param name="session">会话</param> /// <param name="stream">数据流</param> /// <returns>返回是否成功</returns> public static Boolean Send(this ISocketRemote session, Stream stream) { // 空数据直接发出 var remain = stream.Length - stream.Position; if (remain == 0) { return(session.Send(new Byte[0])); } var buffer = new Byte[session.BufferSize]; while (true) { var count = stream.Read(buffer, 0, buffer.Length); if (count <= 0) { break; } var pk = new Packet(buffer, 0, count); if (!session.Send(pk)) { return(false); } if (count < buffer.Length) { break; } } return(true); }
/// <summary>发送字符串</summary> /// <param name="session">会话</param> /// <param name="msg">要发送的字符串</param> /// <param name="encoding">文本编码,默认null表示UTF-8编码</param> /// <returns>返回自身,用于链式写法</returns> public static Boolean Send(this ISocketRemote session, String msg, Encoding encoding = null) { if (String.IsNullOrEmpty(msg)) { return(session.Send(new Byte[0])); } if (encoding == null) { encoding = Encoding.UTF8; } return(session.Send(encoding.GetBytes(msg))); }
/// <summary>发送字符串</summary> /// <param name="session">会话</param> /// <param name="msg">要发送的字符串</param> /// <param name="encoding">文本编码,默认null表示UTF-8编码</param> /// <returns>返回自身,用于链式写法</returns> public static Int32 Send(this ISocketRemote session, String msg, Encoding encoding = null) { if (String.IsNullOrEmpty(msg)) { return(session.Send(Array.Empty <Byte>())); } if (encoding == null) { encoding = Encoding.UTF8; } return(session.Send(encoding.GetBytes(msg))); }
/// <summary>发送数据流</summary> /// <param name="session">会话</param> /// <param name="stream">数据流</param> /// <returns>返回是否成功</returns> public static Boolean Send(this ISocketRemote session, Stream stream) { // UDP的最大缓冲区 var size = 1460L; var remain = stream.Length - stream.Position; // 空数据直接发出 if (remain == 0) { return(session.Send(new Byte[0])); } // TCP可以加大 if (remain > size && session.Client.SocketType == SocketType.Stream) { // 至少使用发送缓冲区的大小,默认8k size = session.Client.SendBufferSize; // 超大数据流,缓存加大一千倍 while (size < 0x80000000 && remain > size << 10) { size <<= 1; } } if (remain < size) { size = (Int32)remain; } var buffer = new Byte[size]; while (true) { var count = stream.Read(buffer, 0, buffer.Length); if (count <= 0) { break; } if (!session.Send(buffer, 0, count)) { return(false); } if (count < buffer.Length) { break; } } return(true); }
/// <summary>异步多次发送数据</summary> /// <param name="session">会话</param> /// <param name="pk">数据包</param> /// <param name="times">次数</param> /// <param name="msInterval">间隔</param> /// <returns></returns> public static Task SendConcurrency(this ISocketRemote session, Packet pk, Int32 times, Int32 msInterval) { var task = TaskEx.Run(async() => { for (var i = 0; i < times; i++) { session.Send(pk); await TaskEx.Delay(msInterval); } }); return(task); }
/// <summary>发送数据流</summary> /// <param name="session">会话</param> /// <param name="stream">数据流</param> /// <returns>返回是否成功</returns> public static Int32 Send(this ISocketRemote session, Stream stream) { // 空数据直接发出 var remain = stream.Length - stream.Position; if (remain == 0) { return(session.Send(new Byte[0])); } var rs = 0; var buffer = new Byte[8192]; while (true) { var count = stream.Read(buffer, 0, buffer.Length); if (count <= 0) { break; } var pk = new Packet(buffer, 0, count); var count2 = session.Send(pk); if (count2 < 0) { break; } rs += count2; if (count < buffer.Length) { break; } } return(rs); }