static async void BinaryInputHandler(ISockAsyncEventAsServer socketAsync) { var fiberW = await socketAsync.GetFiberRw <UserInfo>((input, output) => //我们在这地方使用GZIP 压缩发送流 解压读取流 { var gzip_input = new GZipStream(input, CompressionMode.Decompress); //将读取流解压 var gzip_output = new GZipStream(output, CompressionMode.Compress); //将输出流压缩 return(new GetFiberRwResult(gzip_input, gzip_output)); //这里顺序不要搞反 (input,output)的顺序 }); if (fiberW is null) //如果获取失败 那么断开连接 { socketAsync.Disconnect(); return; } for (; ;) //循环读取处理数据表 类似于 协程 { try { await ReadCommand(fiberW); } catch (System.Net.Sockets.SocketException) { break; } catch (Exception er) { Console.WriteLine(er.ToString()); //出现异常 打印,并且结束循环,断开连接 break; } } socketAsync.Disconnect(); }
static async void BinaryInputHandler(ISockAsyncEventAsServer socketAsync) { var fiberW = await socketAsync.GetFiberRw <UserInfo>(); //获取一个异步基础流 if (fiberW is null) //如果获取失败 那么断开连接 { socketAsync.Disconnect(); return; } for (; ;) //循环读取处理数据表 类似于 协程 { try { await ReadCommand(fiberW); } catch (System.Net.Sockets.SocketException) { break; } catch (Exception er) { Console.WriteLine(er.ToString()); //出现异常 打印,并且结束循环,断开连接 break; } } socketAsync.Disconnect(); }
/// <summary> /// 返回FiberRw /// </summary> /// <param name="socketAsync"></param> /// <returns></returns> protected virtual async Task <IFiberRw <AsyncToken>?> GetFiberRw(ISockAsyncEventAsServer socketAsync) { if (is_use_ssl) //SSL Config { // var (fiber, msg) = await socketAsync.GetFiberRwSSL<AsyncToken>(Certificate!); var(fiber, msg) = decodeType switch { CompressType.None => await socketAsync.GetFiberRwSSL <AsyncToken>(Certificate !), CompressType.gzip => await socketAsync.GetFiberRwSSL <AsyncToken>(Certificate !, (input, output) => { var gzip_input = new GZipStream(input, CompressionMode.Decompress, true); var gzip_output = new GZipStream(output, CompressionMode.Compress, true); return(new GetFiberRwResult(gzip_input, gzip_output)); //return gzip mode }), CompressType.lz4 => await socketAsync.GetFiberRwSSL <AsyncToken>(Certificate !, (input, output) => { var lz4_input = K4os.Compression.LZ4.AsyncStreams.LZ4Stream.Decode(input, leaveOpen: true); var lz4_output = K4os.Compression.LZ4.AsyncStreams.LZ4Stream.Encode(output, leaveOpen: true); return(new GetFiberRwResult(lz4_input, lz4_output)); //return lz4 mode }), _ => throw new NotImplementedException() }; if (fiber is null) { if (msg != null) { Log.Error(msg); } return(null); } else { return(fiber); } } else { return(decodeType switch { CompressType.None => await socketAsync.GetFiberRw <AsyncToken>(), CompressType.gzip => await socketAsync.GetFiberRw <AsyncToken>((input, output) => { var gzip_input = new GZipStream(input, CompressionMode.Decompress, true); var gzip_output = new GZipStream(output, CompressionMode.Compress, true); return new GetFiberRwResult(gzip_input, gzip_output); //return gzip mode }), CompressType.lz4 => await socketAsync.GetFiberRw <AsyncToken>((input, output) => { var lz4_input = K4os.Compression.LZ4.AsyncStreams.LZ4Stream.Decode(input, leaveOpen: true); var lz4_output = K4os.Compression.LZ4.AsyncStreams.LZ4Stream.Encode(output, leaveOpen: true); return new GetFiberRwResult(lz4_input, lz4_output); //return lz4 mode }), _ => throw new NotImplementedException() });
/// <summary> /// 数据包输入 /// </summary> /// <param name="data">输入数据</param> /// <param name="socketAsync">该数据包的通讯SOCKET</param> static async void BinaryInputHandler(ISockAsyncEventAsServer socketAsync) { //USE SSL+GZIP //var (fiberRw, errMsg) = await socketAsync.GetFiberRwSSL<string>(certificate, (input, output) => //{ // var gzip_input = new GZipStream(input, CompressionMode.Decompress, true); // var gzip_output = new GZipStream(output, CompressionMode.Compress, true); // return new GetFiberRwResult(gzip_input, gzip_output); //return gzip mode //}); //var (fiberRw, errMsg) = await socketAsync.GetFiberRwSSL<string>(certificate); //if (fiberRw is null) //{ // Console.WriteLine(errMsg); // socketAsync.Disconnect(); // return; //} var fiberRw = await socketAsync.GetFiberRw <string>(); fiberRw.UserToken = "my is ttk"; byte[] data = new byte[4096]; for (; ;) { try { var x = System.Diagnostics.Stopwatch.StartNew(); var memory = await fiberRw.ReadLine(data); x.Stop(); var str = System.Text.Encoding.Default.GetString(memory.Span); Console.WriteLine(x.ElapsedTicks + ":" + str); fiberRw.Write("200\r\n", false); await fiberRw.Flush(); } catch (System.Net.Sockets.SocketException) { break; } catch (Exception er) { Console.WriteLine(er.ToString()); break; } } socketAsync.Disconnect(); }
/// <summary> /// 返回FiberRw /// </summary> /// <param name="socketAsync"></param> /// <returns></returns> protected virtual async Task <IFiberRw <AsyncToken> > GetFiberRw(ISockAsyncEventAsServer socketAsync) { if (is_use_ssl) //SSL Config { var(fiber, msg) = await socketAsync.GetFiberRwSSL <AsyncToken>(Certificate); if (fiber is null) { Log.Error(msg); return(null); } else { return(fiber); } } else { return(await socketAsync.GetFiberRw <AsyncToken>()); } }