什么是Socket?
Socket(套接字),,用来描述IP地址和端口,是通信链的句柄,是支持TCP/IP协议的网络通信的基本操作单元,是对网络通信过程中端点的抽象表示。
通过 socket 这种约定,一台计算机可以接收其他计算机的数据,也可以向其他计算机发送数据。Socket()函数返回一个整型的Socket描述符,随后的连接建立、数据传输等操作都是通过该Socket实现的。
Socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”,都可以用“打开open –> 读写write/read –> 关闭close”模式来操作。我的理解就是Socket就是该模式的一个实现,socket即是一种特殊的文件,一些socket函数就是对其进行的操作(读/写IO、打开、关闭)
例子: 一个生活中的场景。你要打电话给一个朋友,先拨号,朋友听到电话铃声后提起电话,这时你和你的朋友就建立起了连接,就可以讲话了。等交流结束,挂断电话结束此次交谈。
插述:
TCP(Transmission Control Protocol)传输控制协议,是一种面向连接的、可靠的、基于字节流的通信协议。数据在传输前要建立连接,传输完毕后还要断开连接。客户端在收发数据前要使用 connect() 函数和服务器建立连接。建立连接的目的是保证IP地址、端口、物理链路等正确无误,为数据的传输开辟通道。
Socket是如何创建的?
Socket 是和应用程序一起创建的。应用程序中有一个 socket 组件,在应用程序启动时,会调用 socket 申请创建套接字,协议栈会根据应用程序的申请创建套接字:首先分配一个套接字所需的内存空间,这一步相当于是为控制信息准备一个容器,但只有容器并没有实际作用,所以你还需要向容器中放入控制信息;如果你不申请创建套接字所需要的内存空间,你创建的控制信息也没有地方存放,所以分配内存空间,放入控制信息缺一不可。至此套接字的创建就已经完成了。
套接字创建完成后,会返回一个套接字描述符给应用程序,这个描述符相当于是区分不同套接字的号码牌。根据这个描述符,应用程序在委托协议栈收发数据时就需要提供这个描述符。
Socket通信实现步骤解析
Socket通信实现步骤解析
- 创建ServerSocket和Socket
- 打开连接到的Socket的输入/输出流
- 按照协议对Socket进行读/写操作
- 关闭输入输出流,以及Socket
Socket编写流程
Socket编写流程
- 服务端
- 先创建ServerSocket对象,用来绑定监听的端口;
- 再调用accept()方法来监听客户端的请求;
- 连接建立后,通过输入流读取客户端发送的请求信息,通过输出流向客户端发送响应信息;
- 最后记得关闭相关资源。
- 客户端
- 先创建Socket对象,要指明需要链接的服务器的地址和端号,即两个参数;
- 链接建立后,通过输出流向服务器发送请求信,通过输出流获取服务器响应的信息;
- 最后关闭相关资源
- 步骤: 服务器端先初始化Socket,然后与端口绑定(bind),对端口进行监听(listen),调用accept阻塞,等待客户端连接。在这时如果有个客户端初始化一个Socket,然后连接服务器(connect),如果连接成功,这时客户端与服务器端的连接就建立了。客户端发送数据请求,服务器端接收请求并处理请求,然后把回应数据发送给客户端,客户端读取数据,最后关闭连接,一次交互结束。
代码示例
// 创建Socket客户端对象 Socket s = new Socket("127.0.0.1",6666); // 创建ServerSocket服务器端对象 ServerSocket ss = new ServerSocket(6666); // 监听服务器连接 s = ss.accept();
Socket中TCP的三次握手建立连接详解
我们知道tcp建立连接要进行“三次握手”,即交换三个分组。 // 大致流程如下: 1.客户端向服务器发送一个SYN J 2.服务器向客户端响应一个SYN K,并对SYN J进行确认ACK J+1 3.客户端再想服务器发一个确认ACK K+1 当客户端调用connect时,触发了连接请求,向服务器发送了SYN J包,这时connect进入阻塞状态; 服务器监听到连接请求,即收到SYN J包,调用accept函数接收请求向客户端发送SYN K ,ACK J+1,这时accept进入阻塞状态; 客户端收到服务器的SYN K ,ACK J+1之后,这时connect返回,并对SYN K进行确认; 服务器收到ACK K+1时,accept返回,至此三次握手完毕,连接建立。 // 总结:客户端的connect在三次握手的第二个次返回,而服务器端的accept在三次握手的第三次返回。
Socket中TCP的四次握手释放连接详解
// 图示过程如下: 1.某个应用进程首先调用close主动关闭连接,这时TCP发送一个FIN M; 2.另一端接收到FIN M之后,执行被动关闭,对这个FIN进行确认。它的接收也作为文件结束符传递给应用进程,因为FIN的接收意味着应用进程在相应的连接上再也接收不到额外数据; 3.一段时间之后,接收到文件结束符的应用进程调用close关闭它的socket。这导致它的TCP也发送一个FIN N; 4.接收到这个FIN的源发送端TCP对它进行确认。 这样每个方向上都有一个FIN和ACK。
Socket通信详细介绍2:https://developer.aliyun.com/article/1473578