socket异步实现

wsl_wushili 2017-11-29 04:49:31
客户端socket,异步连接服务端。要求当服务端没开启时,客户端要不停的发出连接请求。客户端代码如下:
main()
{
cs = "false";
ClientSocket.BeginConnect(ie, new AsyncCallback(Connect), ClientSocket);
}
void Connect(IAsyncResult iar)
{
ClientSocket=(Socket)iar.AsyncState;
while (cs == "false")
{
try
{
ClientSocket.EndConnect(iar);
cs = "success";
}catch (Exception e)
{
Console.WriteLine(e.ToString());
cs = "false";
}
Thread.Sleep(1000);
}
}
如果服务器开启状态,上述代码可以正常连接服务器。但如果服务器后于客户端开启,上述代码无法连接上服务器。
...全文
149 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
异步的思想就好像你去公司应聘,你不用堵着人家大门去等待通知,应聘成功了人家自然会电话通知你。一个性能基本良好的应用中(特别是图形界面应用中)可能有成千上万个异步回调,你弄几个死循环(放在线程中)可能就把系统搞得缓慢不堪、几乎死掉了,更别提弄成千上个死循环来模拟异步了。 “循环、阻塞”式的编程,是异步多线程设计的大忌,是一种完全南辕北辙的模拟思路。
  • 打赏
  • 举报
回复
异步的意思,跟循环、阻塞是对立的。比如说
class A
{
    Timer t;

    A(int port)
    {
        this.Port = port;
        t = new Timer(x =>
        {
            if (this.Stream == null)
                Connect();
            else
            {
                t.Dispose();
                t = null;
            }
        }, null, 0, 60000);
    }

    public int Port;
    public NetworkStream Stream;
    public event Action 连接好啦;

    void Connect()
    {
        //..............
    }
}
这样一个对象被创建时,它一瞬间就“结束了”实例化过程,而不是在那里死循环。当连接成功时,它自然就会设置好 Stream 属性(不为 null 了),并且抛出事件通知;当超时时,它自然就会去重连。 总之,异步是不阻塞的。初学者总是用死循环、阻塞的方式来模拟异步,这就好像把脑袋放到地上,是一种刚学时最长见的问题,说明还没有学好这方面设计知识。
  • 打赏
  • 举报
回复
每隔一分钟,“定时”触发一个异步连接请求,直到连接回调时才结束定时操作。这里根本没有什么 while 循环逻辑,而是定时逻辑。如果满脑子只有单线程阻塞式的死循环逻辑,而不是异步事件驱动逻辑,你整个设计思想都会非常僵化狭窄,而且写出来的代码也会非常复杂冗余。
wanghui0380 2017-11-29
  • 打赏
  • 举报
回复
个一个begin配一个end 好把,你自己看代码,你一个begin配了几个end
xian_wwq 2017-11-29
  • 打赏
  • 举报
回复
连接失败时,连接回调函数Connect会捕获到异常 本次异步连接就结束了 下来需要再次发起异步连接 也就是调用BeginConnect
xian_wwq 2017-11-29
  • 打赏
  • 举报
回复
建议先学习ms的技术文档 https://msdn.microsoft.com/zh-cn/library/bew39x2a.aspx
exception92 2017-11-29
  • 打赏
  • 举报
回复
要不停的发出连接请求 -》你的while循环 里边的代码逻辑 什么时候都不会“不停”的运作。

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧