用TcpClient做通信的时候,经常发现网络连接不通的时候,代码就卡死在那里,TcpClient竟然没有超时的设定 泪奔啊 看来微软不是把所有工具准备得妥妥当当的啊

没办法 现在用线程来包装一下这个类 ,勉强可使用。

先上第一个类:这是网上的一种解决方案。

class TimeOutSocket
{
private static bool IsConnectionSuccessful = false;
private static Exception socketexception;
private static ManualResetEvent TimeoutObject = new ManualResetEvent(false);
public static TcpClient TryConnect(IPEndPoint remoteEndPoint, int timeoutMiliSecond)
{
TimeoutObject.Reset();
socketexception = null;
string serverip = Convert.ToString(remoteEndPoint.Address);
int serverport = remoteEndPoint.Port;
TcpClient tcpclient = new TcpClient();
tcpclient.BeginConnect(serverip, serverport,
new AsyncCallback(CallBackMethod), tcpclient);
if (TimeoutObject.WaitOne(timeoutMiliSecond, false))
{
if (IsConnectionSuccessful)
{
return tcpclient;
}
else
{
throw socketexception;
}
}
else
{
tcpclient.Close();
throw new TimeoutException("TimeOut Exception");
}
}
private static void CallBackMethod(IAsyncResult asyncresult)
{
try
{
IsConnectionSuccessful = false;
TcpClient tcpclient = asyncresult.AsyncState as TcpClient;
if (tcpclient.Client != null)
{
tcpclient.EndConnect(asyncresult);
IsConnectionSuccessful = true;
}
}
catch (Exception ex)
{
IsConnectionSuccessful = false;
socketexception = ex;
}
finally
{
TimeoutObject.Set();
}
}
}

插入第二种,自己实现的超时处理代码

 static void Main(string[] args)
{
CancellationTokenSource c = new CancellationTokenSource();
CancellationToken token = c.Token; Task task = new Task(() =>
{
TcpClient client = new TcpClient(AddressFamily.InterNetwork);
client.SendTimeout = ;
client.ReceiveTimeout = ;
client.Connect(IPAddress.Parse("192.168.0.49"), int.Parse(""));
if (client.Connected)
{
byte[] data = System.Text.Encoding.UTF8.GetBytes("AAAAABDEEKRJOWEQRIO@#$(*#@&%");
byte[] buffer = new byte[];
string responseData = string.Empty;
using (NetworkStream stream = client.GetStream())
{
Encoding encode = System.Text.Encoding.GetEncoding("utf-8");
StreamReader Reader = new StreamReader(stream, encode);
Console.WriteLine("\nResponse stream received");
Char[] read = new Char[];
int count = ;
do
{
count = Reader.Read(read, , );
String str = new String(read, , count);
Console.Write(str);
} while (count > );
Reader.Close();
}
}
while (true)
{
if (token.IsCancellationRequested)
{
throw new OperationCanceledException();
}
}
}, token); task.Start();
if (task.Wait(, token))
{ }
else
{
c.Cancel();
Console.WriteLine("任务已经取消");
} }

OK,先写这么多吧

关于TcpClient,Socket连接超时的几种处理方法的更多相关文章

  1. Socket连接超时(转)

    Socket.connect连接超时有二种情况: 1.由于网络的问题,TCP/IP三次握手时间>timeout的设置时间.这在国外访问weibo时,并且网络环境极差的情况下有可能发生.解决的办法 ...

  2. Nodejs回调加超时限制两种实现方法

    odejs回调加超时限制两种实现方法 Nodejs下的IO操作都是异步的,有时候异步请求返回太慢,不想无限等待回调怎么办呢?我们可以给回调函数加一个超时限制,到一定时间还没有回调就表示失败,继续后面的 ...

  3. C# Socket连接超时设置

    问题描述:         对于C# Socket没有超时设置的选项,默认情况下进行Socket连接,返回连接失败需要20-30s时间,严重影响用户体验 问题解决: Socket服务器端: Socke ...

  4. Http请求超时的一种处理方法

    URLConnection类常见的超时处理就是调用其setConnectTimeout和setReadTimeout方法: setConnectTimeout:设置连接主机超时(单位:毫秒) setR ...

  5. PHP利用FTP上传文件连接超时之开启被动模式解决方法

    初始代码: <?php $conn = ftp_connect("localhost") or die("Could not connect"); ftp ...

  6. mysql远程连接失败的两种解决方法

    ---恢复内容开始--- (这是转载别人的,因为我觉得很有用,每次都是参考这个的第二种方法解决的,不管你听不听得到,先说声谢谢!也记下来方便大家看看) mysql解决远程不能访问的二种方法,需要的朋友 ...

  7. C# 控制连接超时

    首先连接超时分为三种,TCP Connection to SQL Server -> SqlConnection.Open -> SqlCommand.Execute先说第二种超时,sql ...

  8. 解决ssh连接超时时间(ssh timeout)的设置方法

    本文介绍下,linux中ssh连接超时时间的设置方法,以避免总是被强行退出.有需要的朋友,参考下吧.有关修改ssh连接超时时间的方法,网上介绍的很多了.比如下面这个:可以减少ssh连接超时等待的时间: ...

  9. [PHP]socket的连接超时 与 读取/写入超时

    socket处理时有两种超时 , 分为连接超时 和 读取/写入数据超时 1. stream_socket_client 函数中的超时时间是连接超时 , 默认是php.ini中的default_sock ...

随机推荐

  1. Linux-cpu分析-vmstat

    转载:https://blog.csdn.net/ty_hf/article/details/63394960 一. 前言 为了更方便的理解本篇内容含义,所以请最好看看如下繁琐的概念,更容易理解. 没 ...

  2. 推荐20个很有帮助的web前端开发教程

    1. CSS Vocabulary 一个伟大的指向和点击的小应用程序,让你加快速度掌握 CSS 语法的各个不同部分,学习各个属性的正确的名称. 2. Liquidapsive 一个简单的信息化布局,通 ...

  3. 如何使用SubtitleWorkshop制作字幕

    任意打开一段字幕文件 对于初学者而言还是最好打开一个带有中英字幕的视频文件(字幕是嵌入在视频文件里面的)然后一句一句照着写 先打开视频预览模式 再打开一段视频文件,并新建一个字幕文件 牢记几个快捷键 ...

  4. NSDate 时区转换问题

    一: NSDateFormatter *dateFormater = [[NSDateFormatter alloc]init]; [dateFormater setDateFormat:@" ...

  5. 微信小程序 - promise(get\post)

    部分源码来自于http://www.wxapp-union.com/home.php?mod=space&uid=17761,就是小程序社区 , 参考以及借鉴一些类似cnblog,csdn上的 ...

  6. nginx高性能webserver具体解释(1)--安装nginx

    1. 下载 本次使用nginx-0.1.2.3 版本号,下载地址 http://nginx.org/en/download.html  新公布版本号 http://nginx.org/download ...

  7. 解决 /dev/mapper/* 100%

    1.查看大文件位置du -sh /* | sort -nr 2.分析,处理文件

  8. 用Java实现AES加密(坑!)

    大坑!使用SecureRandom默认的加密方式即SHA1PRNG生成的密码有误,即使使用相同的password来生成,不同runtime或时刻生成的随机密码也有可能不同,造成的错误为javax.cr ...

  9. 【BIRT】使用rptlibrary设置统一数据源

    在使用birt开发报表的过程中我们通常会发现,如果直接在报表中写死数据源的话,那么之后如果数据库服务器发生变更,那么所有的报表都得一一去修改数据源 这是一个相当耗时间的过程. 1.首先新建librar ...

  10. dojo之配置dojoconfig

    官方教程:Configuring Dojo with dojoConfig例子: <-- set Dojo configuration, load Dojo --> <script& ...