Beispiel #1
0
        //------------------------------------------------------------------------------------------------------------------------
        protected override bool _sendPackedMessage(YPMessagePacked msg)
        {
            //check connection
            if (streamOut == null || _State == ChannelStates.Closed)
                return false;

            lock (writerLock)
            {
                //check connection
                if (streamOut == null || _State == ChannelStates.Closed)
                    return false;

                try
                {
                    //pack
                    var flags = PackedMessageFlags.None;
                    byte[] enc_msg;
                    if (ChannelSerializationMode.HasFlag(YPChannel.ChannelSerializationMode.Json))
                    {
                        var str = msg.ToJSON(HtmlEncode: false);
                        enc_msg = System.Text.Encoding.UTF8.GetBytes(str);
                    }
                    else if (ChannelSerializationMode.HasFlag(YPChannel.ChannelSerializationMode.MessagePack))
                        enc_msg = MsgPack?.Pack_YPMessagePacked(msg);
                    else
                    {
                        DebugEx.Assert("Unkown serialization method");
                        throw new Exception("Unkown serialization method");
                    }

                    //compress?
                    if (enc_msg.Length > CompressThreshold && use_Compression)
                    {
                        using (var outStream = new MemoryStream(enc_msg.Length))
                        {
                            using (var memStream = new MemoryStream(enc_msg))
                            {
                                if (use_Deflate)
                                {
                                    using (var deflStream = new DeflateStream(outStream, CompressionMode.Compress, true))
                                        memStream.CopyTo(deflStream);
                                    //enable deflate
                                    flags |= PackedMessageFlags.Compressed_Deflate;
                                }
                                else if (use_GZip)
                                {
                                    using (var gzipStream = new GZipStream(outStream, CompressionMode.Compress, true))
                                        memStream.CopyTo(gzipStream);
                                    //enable gzip
                                    flags |= PackedMessageFlags.Compressed_GZip;
                                }
                                else
                                {
                                    DebugEx.Assert("Unkown compression");
                                    Close("Unkown compression");
                                }
                            }
                            outStream.Position = 0;
                            enc_msg = outStream.ToArray();
                        }
                    }

                    //create buffer
                    var tSize = BitConverter.GetBytes((UInt32)enc_msg.Length);
                    tSize[3] = (byte)flags;  //higher byte of size is flags
                    var enc_msg2 = new byte[tSize.Length + enc_msg.Length];
                    Buffer.BlockCopy(tSize, 0, enc_msg2, 0, tSize.Length);
                    Buffer.BlockCopy(enc_msg, 0, enc_msg2, tSize.Length, enc_msg.Length);

                    //send
#if NETFX
                    var t = Task.Run(() => { try { streamOut?.Write(enc_msg2, 0, enc_msg2.Length); streamOut?.Flush(); return true; } catch { return false; } });
                    if (!t.Wait(15 * 1000) || t.GetResults() == false) //try to send (with a 15 second sock/stream write timeout)
                    {
                        Close("Failed to write to stream (" + (t.IsCompleted ? "error" : "timeout") + ")");
                        return false;
                    }
#elif UNIVERSAL
                    streamOut?.Write(enc_msg2, 0, enc_msg2.Length);
                    streamOut?.Flush();
#endif
                    return true;
                }
                catch (Exception ex)
                {
                    DebugEx.TraceErrorException(ex, reportIt: false);
                    Close("Packet send exception");
                    return false;
                }
            }
        }
Beispiel #2
0
        //------------------------------------------------------------------------------------------------------------------------
        protected override bool _sendPackedMessage(YPMessagePacked msg)
        {
            //check connection
            if (streamOut == null || _State == ChannelStates.Closed)
            {
                return(false);
            }

            lock (writerLock)
            {
                //check connection
                if (streamOut == null || _State == ChannelStates.Closed)
                {
                    return(false);
                }

                try
                {
                    //pack
                    var    flags = PackedMessageFlags.None;
                    byte[] enc_msg;
                    if (ChannelSerializationMode.HasFlag(YPChannel.ChannelSerializationMode.Json))
                    {
                        var str = msg.ToJSON(HtmlEncode: false);
                        enc_msg = System.Text.Encoding.UTF8.GetBytes(str);
                    }
                    else if (ChannelSerializationMode.HasFlag(YPChannel.ChannelSerializationMode.MessagePack))
                    {
                        enc_msg = MsgPack?.Pack_YPMessagePacked(msg);
                    }
                    else
                    {
                        DebugEx.Assert("YPC (" + Name + ") Unkown serialization method");
                        throw new Exception("Unkown serialization method");
                    }

                    //compress?
                    if (enc_msg.Length > CompressThreshold && use_Compression)
                    {
                        using (var outStream = new MemoryStream(enc_msg.Length))
                        {
                            using (var memStream = new MemoryStream(enc_msg))
                            {
                                if (use_Deflate)
                                {
                                    using (var deflStream = new DeflateStream(outStream, CompressionMode.Compress, true))
                                        memStream.CopyTo(deflStream);
                                    //enable deflate
                                    flags |= PackedMessageFlags.Compressed_Deflate;
                                }
                                else if (use_GZip)
                                {
                                    using (var gzipStream = new GZipStream(outStream, CompressionMode.Compress, true))
                                        memStream.CopyTo(gzipStream);
                                    //enable gzip
                                    flags |= PackedMessageFlags.Compressed_GZip;
                                }
                                else
                                {
                                    DebugEx.Assert("YPC (" + Name + ") Unkown compression");
                                    Close("Unkown compression");
                                }
                            }
                            outStream.Position = 0;
                            enc_msg            = outStream.ToArray();
                        }
                    }

                    //create buffer
                    var tSize = BitConverter.GetBytes((UInt32)enc_msg.Length);
                    tSize[3] = (byte)flags;  //higher byte of size is flags
                    var enc_msg2 = new byte[tSize.Length + enc_msg.Length];
                    Buffer.BlockCopy(tSize, 0, enc_msg2, 0, tSize.Length);
                    Buffer.BlockCopy(enc_msg, 0, enc_msg2, tSize.Length, enc_msg.Length);

                    //send
#if NETFX
                    streamOut?.Write(enc_msg2, 0, enc_msg2.Length);
                    streamOut?.Flush();
#elif UNIVERSAL
                    streamOut?.Write(enc_msg2, 0, enc_msg2.Length);
                    streamOut?.Flush();
#endif
                    return(true);
                }
                catch (Exception ex)
                {
                    DebugEx.TraceErrorException(ex, "YPC (" + Name + ") Packet send exception", reportIt: false);
                    Close("Packet send exception");
                    return(false);
                }
            }
        }