在客户端 写3句 :
clientSocket.send();
clientSocket.send();
clientSocket.send();服务端srvSocket.Receive();
是调用1次还是3次?

解决方案 »

  1.   

    能说的详细点吗?
    是在Listen()中
      

  2.   

    对于tcp来说,最少1次,最多则不限,当你客户端发送东西很大而服务端缓冲区很小时也许1000多次也未可知。不过通常不会这么多,因为现在的网络很快,也比较稳定。实际上没有什么固定的“答案”。客户端连续send三次,也许作为3各包,但是也许作为1个包发送。因为udp等等滥用网络资源,造成了大量阻塞,所以tcp协议后来加入了自动平衡网络流量的许多机制。例如满启动,例如会把多个包合的数据并到一个包缓冲区中发送,等等。你的问题,服务器端一次读取三个send数据、到1000次读取(其中某次读取收到的信息还是粘包的),都是正常的。我其实很少看到正确的长连接写法,csdn上更是根本没有见过。同时,长连接的做法其实并不适合应付成千上万客户端进行大量并发、短促地访问服务器。实际上短连接更好,短连接随即使用发送端口,而且短连接在每一次send之后(也许再进行一个receive之后)就关闭连接,更可靠。
      

  3.   

    可能你首先Receive一次,然后看socket的Avaliable,发现缓冲区中已经没有数据了。但是也许10毫秒之后,再Receive,又有数据了......同时也可能你某一次Receive来的数据是粘包(发送时跨两个send数据)的。就是这样的啊。有什么问题么?如果有问题,肯定是从来没有设计过通信协议造成的,原来从网上抄一两段所谓的“聊天”代码,于是把真正的应用程序想象的太简单。
      

  4.   


    现在的通信协议涉及比较讲究开放性、灵活性(例如随时可以增加属性、改变结构),因此较多采用xml。我最近经常建议别人参考xmpp。你可以使用一个轻量级、只向前读取的xml解析器,对接收到的数据流进行xml解析,一旦读取到一个完整的xml,就可以把这个xml元素取出来执行其功能。
      

  5.   

    因为网上有许多“聊天”软件的demo,只是简单地一个客户端发送一个字符串给服务端,最多再包括发送一个文件,这两个命令就演示聊天系统。看看 RFC3920 的中文翻译文档(它描述了聊天系统可能的框架和必要的条件),再来对比网上那些demo,我们可以发现许多人学习中会遇到的问题,那些demo缺乏设计背景知识因此很容易被误解。