问题标签 [tcpclient]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1034 浏览

vb.net - 聊天系统有一种还是两种方式?

我正在尝试构建一个简单的聊天客户端/软件(整个可执行文件),它从端口 5900 开始监听,当客户端连接到该端口时,聊天就建立了。

问题是只有客户端可以与服务器聊天,服务器无法回答客户端,因为连接以一种方式工作。

我尝试在建立连接时从“服务器”连接到客户端,但系统崩溃警告我该端口已在使用中。

这是我的代码:(以一种方式工作)

我该做什么?使用两个端口?一个写一个读?如果我需要将多个客户端连接到一个用户?(记住同一个exe是服务器/客户端)

请帮帮我=(

0 投票
5 回答
4348 浏览

c# - C# NetworkStream.Read 奇怪

谁能指出这段代码的缺陷?我正在使用 TcpClient 检索一些 HTML。与 IIS 服务器通信时,NetworkStream.Read() 似乎永远不会完成。如果我改用 Fiddler 代理,它可以正常工作,但是当直接与目标服务器对话时,.read() 循环不会退出,直到连接异常出现“远程服务器已关闭连接”之类的错误。

更新

在调试器中,我可以看到整个响应立即通过并附加到我的 StringBuilder(响应)中。当服务器完成发送响应或我的代码没有检测到它时,似乎连接没有关闭。

结论 正如这里所说的,最好利用协议的提供(在 HTTP 的情况下,Content-Length 标头)来确定事务何时完成。但是,我发现并非所有页面都设置了内容长度。所以,我现在使用混合解决方案:

  1. 对于所有事务,将请求的Connection标头设置为“关闭”,以阻止服务器保持套接字打开。这提高了服务器在响应您的请求时关闭连接的机会。

  2. 如果Content-Length已设置,则使用它来确定请求何时完成。

  3. 否则,将 NetworkStream 的 RequestTimeout 属性设置为一个较大但合理的值,例如 1 秒。然后,循环NetworkStream.Read()直到 a) 发生超时,或者 b) 您读取的字节数少于您要求的字节数。

感谢大家出色而详细的回复。

0 投票
3 回答
2618 浏览

c# - 在 C# 中设置 TcpClient 本地端点的问题

为什么以下代码在 C# 中不起作用?

我收到“无法建立连接,因为目标机器主动拒绝了它”。因此,TcpClient 构造函数似乎没有绑定端口,但我尝试了 Socket.Bind() 函数也没有运气。

0 投票
1 回答
3888 浏览

c# - 如何使用主机中的软件中止已建立的连接的消息来查找 SocketException 的原因和原因?

我知道类似的问题可能已经被问过很多次,但我想代表我所看到的行为,并寻找是否有人可以帮助预测造成这种情况的原因。

我正在编写一个通过 TCP 连接到其他 Windows 服务的 Windows 服务。这有 100 个用户实体,每个用户实体有 5 个连接。这些用户使用他们各自的连接来执行他们的任务。

应用程序会继续运行 1 或 2 天。或者有时在开始后立即显示问题(-很少)。我最好的一次跑步是 4 到 5 天,没有出现这个异常。在那个应用程序死了或者我因为各种原因不得不停止它之后。

我想知道是什么原因造成的?这是堆栈跟踪。

System.IO.IOException: Unable to write data to the transport connection: An established connection was aborted by the software in your host machine. ---> System.Net.Sockets.SocketException: An established connection was aborted by the software in your host machine at System.Net.Sockets.Socket.Send(Byte[] buffer, Int32 offset, Int32 size, SocketFlags socketFlags) at System.Net.Sockets.NetworkStream.Write(Byte[] buffer, Int32 offset, Int32 size) --- End of inner exception stack trace --- at System.Net.Sockets.NetworkStream.Write(Byte[] buffer, Int32 offset, Int32 size) at System.Net.Security._SslStream.StartWriting(Byte[] buffer, Int32 offset, Int32 count, AsyncProtocolRequest asyncRequest) at System.Net.Security._SslStream.ProcessWrite(Byte[] buffer, Int32 offset, Int32 count, AsyncProtocolRequest asyncRequest) at System.Net.Security.SslStream.Write(Byte[] buffer, Int32 offset, Int32 count)

0 投票
2 回答
1326 浏览

c# - TcpClient 的创建开销大吗?

我尝试使用 TcpClient 发送/接收数据。我做了两个实验,发现了一些有趣的东西。

我在日本的服务器和英国的 TcpClient 中设置了 TcpListener。我一直向 TcpListener 发送 500 个字节,当 TcpListener 将 10KB 发送回 TcpClient 时。我在每个实验中保持这个发送/接收循环 500 次。

实验一:

在每个发送/接收循环中,我创建一个全新的 TcpClient(从创建之前开始计时)并发送/接收

实验二:

对于所有循环,我只有一个 TcpClient,它保持与 TcpListener 的连接并进行 500 次发送/接收。

结果:

一个循环的时间成本的平均值:

E1:1.8 秒,E2:0.49 秒。

我对这个结果感到非常惊讶。所以保持连接以持续发送/接收可以节省很多时间???将近 2/3 的时间。

这是真的???

谢谢

====新====

@Jon Skeet,@dbemerlin,感谢您的回复。我猜想 Tcp 握手需要一些时间工具。

所以我做了实验3。

我将 HttpListener 设置为服务器并使用 WebClient 发送/接收,数据大小完全相同。每次我使用新的 WebClient 在英国和日本之间发送/接收时。

结果为 0.86(500 次循环的平均值,即发送/接收)。

我假设 WebClient / HttpLisener 本身就是 Tcp,对吧?在我的实验中,它们如何比原始 TcpClient/TcpListener 更快?

再次感谢

0 投票
3 回答
1245 浏览

c# - 在 C# 中使用 TcpClient.Connect() 进行 WHOIS 查询是否昂贵?

一位客户要求我们根据访问该站点的用户的 IP 在其 ASP.NET 站点的主页上进行动态 whois 查询。

实现将类似于此处描述的内容:

http://www.aspheute.com/english/20000825.asp

但是,我注意到此代码连接到 whois.networksolutions.com。我认为如果我们在每次页面加载时都启动与该远程服务器的连接,这可能无法很好地扩展。

例如,假设有 1000 个不同的用户点击主页 - 这将导致启动大量连接。

对此有什么想法吗?

0 投票
2 回答
943 浏览

.net - TcpClient 如何实现 IDisposable 而没有公共的 Dispose 方法?

就像标题说的那样:

TcpClient 如何实现 IDisposable 而没有公共的 Dispose 方法?

0 投票
1 回答
3195 浏览

c# - TcpClient - 等待数据可用

在我的 C# 应用程序中,我有一个线程,它基本上不断地从 TcpClient 读取,直到被告知停止。我为此目的使用 WaitHandles,例如:

如您所见,我正在等待线程被告知停止。如果还没有,它会从 TcpClient 读取所有数据并循环。

我遇到的问题是 10 毫秒的延迟,我宁愿没有。我可以减少它,但我更喜欢程序将暂停直到线程被告知停止或更多数据可用的解决方案。

实际上,我想要的是一个 WaitHandle,它告诉我 TcpClient 上何时有数据可用。这样,我可以使用 WaitHandle.WaitAny。有什么办法可以做到这一点,或者有人可以建议一种替代方法吗?

这不能成为一个麻烦,因为它需要一个相当高性能和轻量级的后台进程。

0 投票
2 回答
167 浏览

c# - 服务器多线程过度杀伤?

我目前正在创建一个服务器类型的应用程序,它将通常监听来自外部客户端的连接,并在它们连接时处理请求等。

目前,每次客户端连接时,我的实现都会创建一对线程。一个线程简单地从套接字读取请求并将它们添加到队列中,第二个线程从队列中读取请求并处理它们。

我基本上是在寻找关于你是否认为拥有所有这些线程是矫枉过正的意见,重要的是这种方法是否会给我带来问题。

需要注意的是,这些线程大部分时间都是空闲的——我在两个线程中都使用了等待句柄(ManualResetEvent)。Reader 线程一直等到消息可用,如果可用,则读取它并将其转储到 Process 线程的队列中。Process 线程一直等待,直到阅读器发出消息在队列中的信号(同样,使用等待句柄)。除非某个特定的客户端真的在敲击服务器,否则这些线程将一直处于等待状态。这很昂贵吗?

我做了一些测试 - 有 1,000 个客户端连接不断唠叨 - 服务器(所以,2,000 多个线程),它似乎处理得很好。

0 投票
2 回答
370 浏览

c# - 即使我只关心它的流,我是否必须存储 TcpClient ?

TcpClient 的新实例连接到远程主机。它的 NetworkStream 被检索和存储。我是否还必须存储 TcpClient 本身以确保它不会被垃圾收集?

如果您要回答“您必须存储它才能处理它”:在我的具体情况下,TcpClient 通常会存在很长时间(应用程序生命周期),因此处理它并不是必须的。但是,我同意,一般来说,它必须被存储才能调用 Dispose。