首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >AcceptTcpClient和AcceptTcpClientAsync的区别

AcceptTcpClient和AcceptTcpClientAsync的区别
EN

Stack Overflow用户
提问于 2013-07-08 14:43:46
回答 2查看 7.7K关注 0票数 3

据我所知,这些台词:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var client = await listener.AcceptTcpClientAsync();

var client = listener.AcceptTcpClient();

应该以同样的方式工作,但如果我尝试打开,例如,5k连接(没有关闭它们),很快侦听器(异步)要么停止响应,要么抛出异常。

有谁知道可能出了什么问题吗?

示例类:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class ListenerTest
{
    static int connectionNumber = 0;
    static int port = 23456;

    public void StartListening(bool async)
    {
        var listener = new TcpListener(IPAddress.Any, port);
        listener.Start();

        if (async)
        {
            var task = HandleConnectionsAsync(listener);
            task.Wait();
        }
        else
            HandleConnections(listener);
    }

    async Task HandleConnectionsAsync(TcpListener listener)
    {
        while (true)
        {
            Console.Write("Waiting for async connection...");
            var client = await listener.AcceptTcpClientAsync();
            Console.WriteLine("OK #" + connectionNumber);
            connectionNumber++;
        }
    }

    void HandleConnections(TcpListener listener)
    {
        while (true)
        {
            Console.Write("Waiting for sync connection...");
            var client = listener.AcceptTcpClient();
            Console.WriteLine("OK #" + connectionNumber);
            connectionNumber++;
        }
    }

    public static void ConnectTest(int count)
    {
        var ep = new IPEndPoint(IPAddress.Loopback, port);
        for (var i = 0; i < count; i++)
            new TcpClient().Connect(ep);
    }
}

用法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
static void Main(string[] args)
{
    var isAsync = true;
    ThreadPool.QueueUserWorkItem(new WaitCallback(StartListening), isAsync);
    ListenerTest.ConnectTest(5000);
}

static void StartListening(object state)
{
    var my = new ListenerTest();
    my.StartListening((bool)state);
}
EN

回答 2

Stack Overflow用户

发布于 2013-11-06 17:00:10

你的测试连接被GC杀死了,如果你“钉住”你的连接直到测试结束-你将得到你的5000个连接(我刚刚复制/粘贴并修复/测试了你的代码)。重写连接测试:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    public static void ConnectTest(int count)
    {
        var ep = new IPEndPoint(IPAddress.Loopback, port);
        List<TcpClient> clients = new List<TcpClient>();
        for (var i = 0; i < count; i++)
        {
            TcpClient cl = new TcpClient();
            clients.Add(cl);
            cl.Connect(ep);
        }
    }

还请注意,在“真实世界”条件下,您需要在启动侦听器循环之前添加类似以下内容:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ThreadPool.SetMinThreads(100, 100);

这让你的代码在“突发”连接计数/网络负载下工作。我们刚刚在linux/mono下成功地“负载测试”了7,5K个连接。

票数 4
EN

Stack Overflow用户

发布于 2013-07-08 14:54:33

您不能在一台机器上有100,000个连接。TCP/IP只有16 bits for a port number (maximum 64k ports),并且其中有大量用于(或保留)操作系统或各种服务。

通常,传入客户端连接的only 16,383 of these ports are available,您需要与all the other processes that use TCP/IP regularly共享它们。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17529529

复制
相关文章
= =和equals的区别,break和continue的区别
= =和equals的区别: equals和==最大的区别是一个是方法一 个是运算符。 ==:如果比较的对象是基本数据类型,则此较的是数值是否相等;如果比较的是引用数据类型,则比较的是对象的地址值是否相等。 equals():用来比较方法两个对象的内容是否相等。 注意: equals 方法不能用于基本数据类型的变量,如果没有对equals方法进行重写,则比较的是引用类型的变 量所指向的对象的地址。
海拥
2021/08/23
2K0
[PHP] ??和?:的区别
??是null合并运算符 <?php // NULL 合并运算符的例子 $action = $_POST['action'] ?? 'default'; // 以上例子等同于于以下 if/else
唯一Chat
2021/07/20
6.1K0
[PHP] ??和?:的区别
&和&&的区别
&运算符有两种用法: (1)按位与; (2)逻辑与。 &&运算符是短路与运算。逻辑与跟短路与的差别是非常巨大的,虽然二者都要求运算符左右两端的布尔值都是true整个表达式的值才是true. &&之所以称为短路运算是因为,如果&&左边的表达式的值是false,右边的表达式会被直接短路掉,不会进行运算。很多时候我们可能都需要用&&而不是&,例如在验证用户登录时判定用户名不是null而且不是空字符串,应当写为 username != null &&!usemame.equal(""), 二者的顺
海拥
2021/08/23
1.3K0
for of和for in的区别
两个遍历方式的最终区别就在于:for in遍历的是数组的索引(即键名),而for of遍历的是数组元素值。
OECOM
2020/07/01
1.3K0
堆和栈的区别(队列和栈的区别)
堆(Heap)与栈(Stack)是开发人员必须面对的两个概念,在理解这两个概念时,需要放到具体的场景下,因为不同场景下,堆与栈代表不同的含义。一般情况下,有两层含义: (1)程序内存布局场景下,堆与栈表示两种内存管理方式; (2)数据结构场景下,堆与栈表示两种常用的数据结构。
全栈程序员站长
2022/07/28
3.1K0
堆和栈的区别(队列和栈的区别)
jupyternotebook和pycharm的区别_jupyternotebook和pycharm的区别
打开PyCharm,在界面的左下方点击进入Python Console,看到熟悉的Jupyter Notebook界面:
全栈程序员站长
2022/09/27
1.5K0
jupyternotebook和pycharm的区别_jupyternotebook和pycharm的区别
HashSet和HashMap的区别 && HashTable和HashMap的区别
2.Hashtable 中的方法是同步的,而HashMap中的方法在缺省情况下是非同步的。
week
2018/08/27
9860
stringbuild和stringbuffer的区别_string和stringbuilder的区别
JAVA平台提供了两个类:String和StringBuffer,它们可以储存和操作字符串,即包含多个字符的字符数据。这个String类提供了数值不可改变的字符串。而这个StringBuffer类提供的字符串进行修改。当你知道字符数据要改变的时候你就可以使用StringBuffer。典型地,你可以使用StringBuffers来动态构造字符数据。另外,String实现了equals方法,new String(“abc”).equals(new String(“abc”)的结果为true,而StringBuffer没有实现equals方法,所以,new StringBuffer(“abc”).equals(new StringBuffer(“abc”)的结果为false。
全栈程序员站长
2022/11/08
6230
perl '-&gt;' 和 '::' 的区别 | 方法和函数的区别
我们知道在 Perl 中,Function 和 Subroutine 这两个名称是可以互换的。但是函数和方法的区别到底是什么呢?
宋天伦
2023/10/20
2900
hashmap和hashtable和hashset的区别_反映和反应的区别
HashMap与Hashtable的区别是面试中经常遇到的一个问题。这个问题看似简单,但如果深究进去,也能了解到不少知识。本文对两者从来源,特性,算法等多个方面进行对比总结。力争多角度,全方位的展示二者的不同,做到此问题的终结版。
全栈程序员站长
2022/09/30
7470
hashmap和hashtable和hashset的区别_反映和反应的区别
paraphrase和translation的区别_translating和interpreting的区别
PreTranslateMessage是消息在送给TranslateMessage函数之前被调用的,绝大多数本窗口的消息都要通过这里,比较常用,当需要在MFC之前处理某些消息时,常常要在这里添加代码.
全栈程序员站长
2022/09/30
6710
python encode和decode的区别_encode和decode的区别
字符串在Python内部的表示是unicode编码,因此,在做编码转换时,通常需要以unicode作为中间编码,即先将其他编码的字符串解码(decode)成unicode,再从unicode编码(encode)成另一种编码。
全栈程序员站长
2022/11/10
1.1K0
git和github gitlab的区别_gitlab和git区别
GitHub是在线代码仓库,全世界只有GitHub一家,大家把代码存储在人家的服务器上。 Gitlab相当于小型的GitHub,你可以在本地搭建一个属于你自己的类似GitHub仓库,让小伙伴把代码存储在上面,这样代码只有你们几个人能看见,但是你要存在GitHub上,全世界都能看见
全栈程序员站长
2022/11/01
6540
Mybatis——#{}和${}的区别
在使用mybatis的时候我们会使用到#{}和${}这两个符号来为sql语句传参数,那么这两者有什么区别呢?
向着百万年薪努力的小赵
2022/12/02
4890
Mybatis——#{}和${}的区别
Python - //和/的区别
/ 表示浮点数除法,返回浮点结果; // 表示整数除法,返回不大于结果的一个最大的整数 print("6 // 4 = " + str(6 // 4)) print("6 / 4 =" + str(6 / 4)) 执行结果 6 // 4 = 1 6 / 4 =1.5
小菠萝测试笔记
2020/06/09
7390
equals和==的区别
equals的作用: 用于判断两个变量是否是对同一个对象的引用,即堆中的内容是否相同,返回值为布尔类型 String类型比较不同对象内容是否相同,应该用equals "=="操作符的作用 1、用于基本数据类型的比较 2、判断引用是否指向堆内存的同一块地址。 把String当作基本类型来使用时: 例:如果值不相同,对象就不相同,所以"==" 和equals结果一样 String s1 = "java"; String s2 = "java"; System.out.println(s1==s2);
gfu
2019/08/28
8030
mybatis(#和$的区别)
1 #是将传入的值当做字符串的形式,eg:select id,name,age from student where id =#{id},当前端把id值1,传入到后台的时候,就相当于 select id,name,age from student where id ='1'.
gfu
2019/10/21
6160
==和equals的区别
当执行String s1 = “chance”;这条语句时,会在堆中的字符常量池里找”chance”这个字符串,若没有找到,则将”chance”这个字符串放入字符串常量池中.而在栈中开辟一块名为s1的空间存放”chance”,这块空间的引用.
Java架构师历程
2018/09/26
1.6K0
==和equals的区别
#if 和#ifdef的区别
转载自 http://blog.csdn.net/zhangchiytu/article/details/7563329  先看个例子: #define TARGET_LITTLE_ENDINA 1 #define TARGET_BIG_ENDINA   0 #ifdef TARGET_LITTLE_ENDINA call little endina function #else call big endina function #endif 不管把TARGET_LITTLE_ENDINA和TARGET_
老白
2018/03/19
1.3K0
点击加载更多

相似问题

AcceptTcpClient()和基于TcpClient的类

12

取消阻止AcceptTcpClient调用

59

AcceptTcpClient对AcceptSocket

10

异步CTP AcceptTcpClientAsync方法

10

TcpListener.AcceptTcpClient和防火墙

20
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文