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框架的更多相关文章

  1. Voovan 是一个高性能异步网络框架和 HTTP(Java)

    Voovan 是一个高性能异步网络框架和 HTTP 服务器框架,同时支持 HTTP 客户端抓取.动态编译支持.数据库访问封装以及 DateTime.String.Log.反射.对象工具.流操作.文件操 ...

  2. 一个高性能异步socket封装库的实现思路 (c#)

    前言 socket是软件之间通讯最常用的一种方式.c#实现socket通讯有很多中方法,其中效率最高就是异步通讯. 异步通讯实际是利用windows完成端口(IOCP)来处理的,关于完成端口实现原理, ...

  3. 《Unity 3D游戏客户端基础框架》多线程异步 Socket 框架构建

    引言: 之前写过一个 demo 案例大致讲解了 Socket 通信的过程,并和自建的服务器完成连接和简单的数据通信,详细的内容可以查看 Unity3D -- Socket通信(C#).但是在实际项目应 ...

  4. 写自己的Socket框架(一)

    本系列仅介绍可用于生产环境的C#异步Socket框架,如果您在其他地方看到类似的代码,不要惊讶,那可能就是我在参考开源代码时,直接“剽窃”过来的. 1.在脑海里思考一下整个socket的链接的处理流程 ...

  5. 【转】C#高性能大容量SOCKET并发(二):SocketAsyncEventArgs封装

    http://blog.csdn.net/sqldebug_fan/article/details/17557341 1.SocketAsyncEventArgs介绍 SocketAsyncEvent ...

  6. C#高性能大容量SOCKET并发(二):SocketAsyncEventArgs封装

    原文:C#高性能大容量SOCKET并发(二):SocketAsyncEventArgs封装 1.SocketAsyncEventArgs介绍 SocketAsyncEventArgs是微软提供的高性能 ...

  7. Java异步NIO框架Netty实现高性能高并发

    原文地址:http://blog.csdn.net/opengl_es/article/details/40979371?utm_source=tuicool&utm_medium=refer ...

  8. 可扩展多线程异步Socket服务器框架EMTASS 2.0 续

    转载自Csdn:http://blog.csdn.net/hulihui/article/details/3158613 (原创文章,转载请注明来源:http://blog.csdn.net/huli ...

  9. C# 实现的多线程异步Socket数据包接收器框架

    转载自Csdn : http://blog.csdn.net/jubao_liang/article/details/4005438 几天前在博问中看到一个C# Socket问题,就想到笔者2004年 ...

随机推荐

  1. if语句&switch&Scanner

    if流程控制语句: if 语句的用语法如下: if(boolean表达式){ //如果条件为true那么执行 } 只有条件为true时才会执行,否则执行if语句后面的代码. 实例代码: public ...

  2. shell脚本的一些常用操作

    字符串长度: ${#string}可获取string字符串的长度,如下: jenkins@soft1pc:~$ str="who are you"jenkins@soft1pc:~ ...

  3. oracle 中对查询出来的数据进行切割、截取等操作

    oracle 中对查询出来的数据进行切割.截取等操作 最近遇到一个问题,需要把一个带有,的字符串拆分成多行.通过查询资料,这个操作需要使用以下2个关键知识: 1. REGEXP_SUBSTR函数 这个 ...

  4. JS,JQuery小知识

    http://blog.163.com/wumingli456@126/blog/static/28896414201112252456459/?suggestedreading&wumii

  5. Got error -1 from storage engine

    有个小朋友修复从库,但是start slave 后,报错信息如下 Could not execute Write_rows event on table hsfdssdb.mf_textannounc ...

  6. bzoj2839 集合计数(容斥)

    2839: 集合计数 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 883  Solved: 490[Submit][Status][Discuss] ...

  7. 使用nginx代理kibana并配置登录验证

    由于kibana不支持登录验证,谁都可以访问,放到公网就不合适了,这里配置用nginx进行代理: 生成密码文件 如果安装了httpd可以用htpasswd,比较方便: htpasswd -c /roo ...

  8. Labels & Codes

     Labels & Codes List of Codes Adjectives Nouns Verbs Other labels Adjectives adjective A word th ...

  9. javascript 之 面向对象【理解对象】

    第五版本 6.1.1  属性类型      1/数据属性 :包含有数据值的问题.有内部有特性和属性,是为了实现javaScript引擎用的,在javaScript中不能直接访问  [[Configur ...

  10. docker daemon 配置代理

    创建插件目录 sudo mkdir -p /etc/systemd/system/docker.service.d 编写proxy配置文件 #vim /etc/systemd/system/docke ...