- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
据我了解,这些行:
var client = await listener.AcceptTcpClientAsync();
var client = listener.AcceptTcpClient();
应该以同样的方式工作,但是如果我尝试打开,例如,5k 连接(而不关闭它们),监听器(异步)很快就会停止响应或抛出异常。
有人知道哪里出了问题吗?
示例类:
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);
}
}
用法:
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);
}
最佳答案
您的测试连接被 GC 杀死,如果您“固定”您的连接直到测试结束 - 您将获得 5000 个连接(我刚刚复制/粘贴并修复/测试了您的代码)。重写的连接测试:
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);
}
}
另请注意,在“真实世界”条件下,您需要在开始监听器循环之前添加如下内容:
ThreadPool.SetMinThreads(100, 100);
这让您的代码在“突发”连接计数/网络负载下工作。我们刚刚在 linux/mono 下成功地“负载测试”了 7,5K 个连接。
关于c# - AcceptTcpClient 和 AcceptTcpClientAsync 区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17529529/
我正在使用使用 TcpListener 的 C++/CLI 制作一个小程序,我知道 AcceptTcpClient 是一种同步方法,它会阻塞 UI 线程。我如何调用此方法才能使其不会阻塞我的 UI?这
在我的应用程序中,我目前在 AcceptTcpClient(或 EndAcceptTcpClient)抛出异常时停止监听。当我停止监听器(套接字错误 10004)或断开网络适配器时,通常会抛出异常。
我有一个 TcpListener 对象,它在防火墙后面的 4000 端口上运行。显然,为了让外部客户端连接到 TcpListener,需要在防火墙中打开端口 4000;否则,外部连接请求将无法通过。
众所周知,在 C# 中接受传入 TCP 连接的最简单方法是循环 TcpListener.AcceptTcpClient()。此外,这种方式将阻止代码执行,直到获得连接。这对 GUI 有极大的限制,所以
AcceptTcpClient() 阻止应用程序在我调用 thrd.Abort() 后退出。 监听时如何退出应用? 最佳答案 您应该能够通过关闭 TcpListener 来中断对 AcceptTcpC
我想写一个简单的多线程服务器-客户端应用程序我在创建 tcplistenr 时偶然发现了这两个 public void serverListenr { int MessageLengt
我需要一个类来包含 TcpClient 的所有内容 + 几个额外的字段,所以我创建了一个基于 TcpClient 的类: public class MyClient: TcpClient {
据我了解,这些行: var client = await listener.AcceptTcpClientAsync(); var client = listener.AcceptTcpClient(
我必须在Windows窗体的标签上显示客户端ip地址 这是我写的代码 private void Form1_Load(object sender, EventArgs e) {
我正在使用 Powershell 编写一个简单的 TCP/IP 服务器。我注意到 Ctrl-C 不能中断 AcceptTcpClient() 调用。 Ctrl-C 在通话后工作正常。我四处搜索,到目前
可能只看这个视频:http://screencast.com/t/OWE1OWVkO如您所见,连接启动(通过 telnet 或 firefox)与我的程序第一次收到消息之间的延迟。 这是等待连接的代码
我有一个用 Java 实现的套接字监听器应用程序,并且工作正常 C#代码: IPAddress serverAddress = IPAddress.Parse("127.0.0.1")
我是一名优秀的程序员,十分优秀!