MSDN上面的 c#异步套接字例子,客户端向服务器发一条数据后就断开了。如何实现无限次发送呢?

解决方案 »

  1.   

    果断不行啊试了好几次。服务端有个shutdown, 注释了客户端收不到消息。不注释,则提示远程连接已关闭
      

  2.   

    无法回答你的这个问题。太空泛了。简单来说,通讯有两种。一种是“一问一答”的方式,叫做短链接。另外一种是双向、任何一方都可能发起消息的方式,叫做长连接。其中在长连接,由于一方向另一方发送的消息是数据流,因此你至少需要自定义信令的格式,来识别一个个消息。比如说客户端共并发有5个请求,并且以顺序1、2、3、4、5的顺序向服务器端发送。然后服务器端接受了数据流(可能执行了3次Receiive指令就受到了5个消息),分别并行执行,并且以5、2、3、1、4的顺序返回给客户端。客户端收到这些消息,根据消息的序列编号,调出此消息的回调方法,执行。从客户端编程来看,可能是这样:var command = new GetTask{ id= 23324};
    gateway.SendMessage<TaskABC>(command, callback);private void callback(TaskABC t)
    {
        ......
    }
    也就是说客户端异步地向服务器端发送一个指令command,然后当服务器端执行完毕(可能3毫秒,也可能10秒钟)之后回调方法callback针对返回值t进行后续处理。
      

  3.   

    http://technet.microsoft.com/zh-cn/library/bew39x2a(v=vs.85).aspx  就这上面的例子
      

  4.   

    这其实跟你是用什么ajax调用,是一样的道理。所不同的是,http是短链接的,因此你实现客户端时,每一次都发起新的请求(进行tcp的三次握手)。而如果是长连接的,则是复用第一次建立的连接,在同一个stream上write和read,并不关闭它。仅仅是这个差别而已。
      

  5.   

    晕!这个文章只是为了说明那一个 beginXXX 语法而生硬拼凑出来的代码。这根本就是短链接,只不过画蛇添足地用了异步写法。实际上,如果你就是短链接,你就是那四个动作(connect、send、receive、shutdown),那么你干么要额外地整什么异步线程、然后再用ManualResetEvent 把线程阻塞起来呢?这纯粹是用异步多线程的写法来模拟顺序程序,是画蛇添足的。实际上用顺序的代码,少量地写几行代码就行了,用不着像这个文章这样整一大堆莫名其妙的东西。这个文章说明了,立意太低,写出来的技术文章里边的代码,就会画蛇添足。
      

  6.   

    关键的需要实现的地方,我在#7给你写了。至于说gateway的封装形式,则不一定与我在#4楼中举例完全一样!
      

  7.   

    嗯,是的。在msdn上几乎所有关于通讯的文章都很垃圾。我才微软总是找实习生写文章,而这类型的文章本来不应该找实习生写的。关键是,这个文章不是长连接,其实是短链接。也就是跟楼主说的“客户端向服务器发一条数据后就断开了”是一样的。只不过用了唬人的“异步”。
      

  8.   

    他这个是被服务器给 shutdown的,以此来判断是否是长连接或者段连接?