Esempio n. 1
0
        /// <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);
        }
Esempio n. 2
0
        /// <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);
        }
Esempio n. 3
0
        /// <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)));
        }
Esempio n. 4
0
        /// <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)));
        }
Esempio n. 5
0
        /// <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);
        }
Esempio n. 6
0
        /// <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);
        }
Esempio n. 7
0
File: ISocket.cs Progetto: an1ju/Qi
        /// <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);
        }