Socket 知识点总结复习

2019-07-08  本文已影响0人  过期的薯条

Socket 知识总结

1.socket 概念
    Socket套接字是通信的基石,是支持TCP/IP协议的网络通信的基本操作单元。它是网络通信过程中端点的抽象表示,包含进行网络通信必须的五种信息:连接使用的协议,本地主机的IP地址,本地进程的协议端口,远地主机的IP地址,远地进程的协议端口。

    Socket本质是编程接口(API),对TCP/IP的封装,TCP/IP也要提供可供程序员做网络开发所用的接口,这就是Socket编程接口;HTTP是轿车,提供了封装或者显示数据的具体形式;Socket是发动机,提供了网络通信的能力
image

通讯流程:


image

2.socket 断开重连

3. shutdownOutput /shutdownIutput vs close

4.断开重连

5.阻塞和非阻塞

6.cpu占用率

while (true) {
            int i=0;
            try {
                if (socket.isConnected()&&in.available()>0) {//非阻塞方法,时时刻刻在执行
                    final String s = in.readUTF();//阻塞挂起cpu
                    this.onReceive(addr, s);
                } //应该在else处  加入一个 睡眠,减缓cpu的执行
            } catch (Exception e) {
                runFlag = false;
            }
        }

7.socket 死锁

8. inputStream.read() 返回-1

通常在文件读取的时候,当read函数返回-1的时候就代表,文件读取结束,跳出循环。而Socket中read函数返回-1,并不是代表数据结束。read函数是阻塞函数,当没得数据的时候,将会一直阻塞在哪里。能读取到数据,则返回读取的字节数。返回-1,有如下情况:

调用了socket.close()

inputStream/outputStream.shutdowOut/InputStream

9.socket 粘包 和拆包

粘包概念 黏包实际上是对网络通信的一种优化,假如说上层只发送一个字节数据,而底层却发送了41个字节,其中20字节的I P首部、 20字节的T C P首部和1个字节的数据,而且发送完后还需要确认,这么做浪费了带宽,量大时还会造成网络拥堵。当然它还是有一定的缺点的,就是因为它会合并一些包会导致数据不能立即发送出去,会造成延迟,如果能接受(一般延迟为200ms),那么还是不建议关闭这种优化,如果因为黏包会造成业务上的错误,那么请改正你的服务端读取算法(协议),因为即便不发生黏包,在服务端缓存区也可能会合并起来一起提交给上层,推荐使用长度+类型+数据模式。 socket 有一个api 可以控制是否及时发送。 mSocket.setTcpNoDelay() TCP_NODEALY的默认值为false,表示采用Negale算法。如果调用setTcpNoDelay(true)方法,就会关闭Socket的缓冲,确保数据及时发送

拆包概念 数据链路层对数据包的上线是有要求的,一般要小于MTU。所以当数据包过大,将会拆包。那么服务端 读取的数据包可能出现 “半包”的情况。

解决方案: 由于底层的TCP无法理解上层的业务数据,所以在底层是无法保证数据包不被拆分和重组的,这个问题只能通过上层的应用协议栈设计来解决,根据业界的主流协议的解决方案,可以归纳如下。

(1)消息定长,例如每个报文的大小为固定长度200字节,如果不够,空位补空格;

(2)在包尾增加回车换行符进行分割,例如FTP协议;

(3)将消息分为消息头和消息体,消息头中包含表示消息总长度(或者消息体长度)的字段,通常设计思路为消息头的第一个字段使用int32来表示消息的总长度;

(4)更复杂的应用层协议。

上一篇 下一篇

猜你喜欢

热点阅读