由于是第一次用socket编程写即时通讯,遇到的问题还真不少。最近又遇到一个奇葩的问题:对于文本信息,我的发送按钮似乎不太听使唤。消息编辑好了,点击一次send发送消息,但收不到服务器返回的数据,聊天界面上没有显示聊天消息。这下我就纳闷了,在没有用socket编程之前,我的发送按钮确实没问题,可以把textfield上编辑的信息显示到聊天界面上。然后,我把文本框的消息不删除,消息编辑,再点击一次send发送消息,没收到数据,多点击几次按钮,有反应了,发现点击两次才能接收数据成功,或者距离上一次发送的时间间隔小一点也能接收。

        设置断点调试,发送给服务器没有问题,但是服务器返回来的数据时而能收到时而不能收到。后来goole,问大神,终于找到问题所在--延迟。

       "粘包"可发生在发送端也可发生在接收端.

1.由Nagle算法造成的发送端的粘包:默认情况下,发送数据采用Negale算法。Nagle算法是一种改善网络传输效率的算法。简单的说,当我们提交一段数据给TCP发送时,TCP并不立刻发送此段数据,而是等待一小段时间,看看在等待期间是否还有要发送的数据,若有则会一次把这两段数据发送出去。
2.接收端接收不及时造成的接收端粘包:TCP会把接收到的数据存在自己的缓冲区中,然后通知应用层取数据。当应用层由于某些原因不能及时的把TCP的数据取出来,就会造成TCP缓冲区中存放了几段数据。


用户每次敲几个字节的消息,而下层在攒这些数据,想等到数据量多了再发送,这样用户会等到发疯。

        socket有两个选项: TCP_CORK和TCP_NODELAY。TCP_NODELAY则是不等待,只要缓冲区里有数据,就发送出去。默认情况下是TCP_CORK。知道了这个,我们就可以解决了,在程序中设置“发送不延迟”,就不存在粘包的问题了。

具体方法:在连接服务器那里,设置发送不延迟

Android 清空socket缓冲区_TCP

再加上两个头文件,

#import <netinet/tcp.h>

#import <netinet/in.h>

OK,解决。关于socket我还在继续学习当中,写的不好之处,还望大家指出,谢谢!