TcpClient与服务器通信以保持c#中的活动连接?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了TcpClient与服务器通信以保持c#中的活动连接?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3049字,纯文字阅读大概需要5分钟。
内容图文
![TcpClient与服务器通信以保持c#中的活动连接?](/upload/InfoBanner/zyjiaocheng/821/44c4d9bb7fae4a92bc44cbb05272db7d.jpg)
我有这个TcpClient代码,工作正常.它连接到Linux系统上的perl服务器并接收服务器发送给它的任何东西.很好地工作.
public static void Main() {
foreach (ProtocolConnection tcpConnection in TcpConnectionsList) {
ProtocolConnection connection = tcpConnection;
ThreadPool.QueueUserWorkItem(_ => {
ThreadTcpClient(connection);
ManualResetEventTcp.Set();
});
}
... Some code...
}
public static void TcpConnect(ProtocolConnection varConnection) {
int retryCountSeconds = varConnection.RetryEverySeconds*Program.MilisecondsMultiplier;
int count = 0;
while (true) {
try {
using (var client = new TcpClient(varConnection.IpAddress.ToString(), varConnection.Port) { NoDelay = true })
using (var stream = client.GetStream()) {
var data = new Byte[256];
while (!Program.PrepareExit) {
Int32 bytes = stream.Read(data, 0, data.Length);
string varReadData = Encoding.ASCII.GetString(data, 0, bytes).Trim();
if (varReadData != "" && varReadData != "PONG") {
VerificationQueue.EnqueueData(varReadData);
Logging.AddToLog("[TCP][" + varConnection.Name + "][DATA ARRIVED]" + varReadData);
} else {
Logging.AddToLog("[TCP]" + varReadData);
}
}
}
} catch (Exception e) {
if (e.ToString().Contains("No connection could be made because the target machine actively refused it")) {
Logging.AddToLog("[TCP][ERROR] Can't connect to server (" + varConnection.Name + ") " + varConnection.IpAddress + ":" + varConnection.Port );
} else {
Logging.AddToLog(e.ToString());
}
}
DateTime startTimeFunction = DateTime.Now;
do {
Thread.Sleep(1000);
} while (((DateTime.Now - startTimeFunction).TotalSeconds < retryCountSeconds));
}
}
但是在某些条件下我遇到了一些问题:
>我的工作连接经常在一些空闲时间之后断开连接,所以我在服务器中实现,所以当它收到PING时它会以PONG响应.我可以用服务器发送带有UDP的PING,它会在tcp上用PONG响应,但我更喜欢内置的方式进入tcp客户端,所以每隔60秒就会发送PING.即使UDP解决方案可以接受,我也没有超时字符串varReadData = Encoding.ASCII.GetString(data,0,bytes).Trim();所以当PONG没有到达时,我的客户甚至都没有注意到它.它只是在等待…这让我…
>我的另一个问题是,在某些时候字符串varReadData = Encoding.ASCII.GetString(data,0,bytes).Trim();这一直在等待数据.当服务器崩溃或断开我的客户端时,我甚至都没有注意到.我希望服务器有某种超时或检查连接是否有效.如果它不活动,它应该尝试重新连接.
修复此TcpClient最简单的方法是什么?我如何实现双向通信,确保如果服务器丢失我的连接或我的网络断开客户端将注意到它并重新建立连接?
解决方法:
它不是Encoding.ASCII.GetString(data,0,bytes).Trim();永远阻止,它是stream.Read()
如果您正在阅读,则无法轻易区分丢弃连接的服务器(或其间的任何NAT网关),以及服务器根本没有任何内容可以发送给您的情况.如果TCP FIN / RST数据包在发生故障时未到达您的客户端,或者NAT网关静默丢弃您的连接,则至少应该这样做.
你可以做什么;
>设置Send / ReceiveTimeout,如果发生超时则ping服务器,或通过TCP连接实现自己的心跳消息.如果您在合理的时间内没有收到心跳,请重新建立或采取其他措施.
>设置TCP keepalive选项,并依靠它来告诉您服务器是否已经消失.见代码here.
最后一点将告诉您tcp连接是否失败,它不会告诉您服务器是否有一些失败 – 例如如果你按住你的perl服务器,它就会在tcp窗口关闭的情况下不做任何事情,所以如果你需要的话,你可能需要实现自己的热备份来覆盖这样的情况.
内容总结
以上是互联网集市为您收集整理的TcpClient与服务器通信以保持c#中的活动连接?全部内容,希望文章能够帮你解决TcpClient与服务器通信以保持c#中的活动连接?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。