当今互联网中的大千世界都驻足于TCP/IP协议之上。而通过Socket操作TCP/IP协议已经成为了事实上的标准,Socket甚至已经成为了网络编程的同义词。当然了,由于我们早已习惯于各种封装/框架,很少裸用Socket,所以对它的理解始终有一种模糊的感觉。
今天,我就来介绍一下Socket。
socket在网络编程中被翻译为套接字。它的本意是插座,把它用来表示网络通信的接口确实很贴切。你看,两个需要通信的机器把他们的线缆插上插座(Socket),就可以通信了。
socket在程序员看来其实就是一个操作网络的API,应用程序通过Socket来和内核层面的tcp/ip等例程进行交互,最后由网卡发到整个网络上。
当然了,Socket不仅仅是TCP的API,UDP、IP甚至其它一些协议也用Socket来操作。由于它是个普遍的标准,所以基本一切可供应用层使用的协议API都和Socket有关。
一般应用里面只要和别人通信,都需要socket。无论是http、dubbo还是jdbc,林林总总,有通信的地方都有socket。
为什么Socket这么流行,已经成为了网络编程的同义词呢?其实就是由于其提供了非常简洁的接口。除了打开方式稍稍有些复杂之外,其它和读文件一样,只需要read/write即可。
一对相互通信的socket就组成了我们天天挂在嘴边的连接,一般(本端ip:port,协议,对端ip:port)组成一个唯一的连接。
就TCP来说,Socket分为Client端和Server端两种。就以一个简单的Java时间服务器为例
看下,代码的编写方法。
这边client端采用的是短连接的方式连接server端,而server端用的是单线程处理socket的方式。采用的都是最简单的方案。其中有一个细节,如果需要让socket.read返回-1,那么对端的socket必须shutdown或者close才行。下图就是我们的处理流程:
上面的代码笔者放在码云上面,有需要的同学可以去码云下载
git clone https://gitee.com/alchemystar/zero
Socket由于其简洁的API被广泛使用,到现在已经成为了网络编程的同义词。正是由于其简洁性和易用性,在我们程序猿的手上演化出各种复杂的用法(阻塞/非阻塞,短连接/长连接,超时…),后面笔者会一一道来。