SOCKET 协议
Socket 是传输层协议的具体软件实现,它封装了协议底层的复杂,为开发人员提供了便利的网络连接。Socket 是网络编程的基石,像 Http 的请求, 的连接等绝大部分的网络连接都是基于 Socket 实现的。
传输层有 TCP/UDP 两种连接方式,所以对应的 Socket 也有两种不同实现方式,掌握 Socket 的前提是了解清楚这两种协议。
面向连接,且具备顺序控制和重发机制的可靠传输。他的可靠性是在于传输数据前要先建立连接,确保要传输的对方有响应才进行数据的传输。因此 TCP 有个经典的 3 次握手和 4 次挥手。
握手的目的是为了相互确认通信双方的状态都是正常的,没有问题后才会进行正式的通信:
3 次握手的整个过程看着似乎有点过于谨慎,但是互联网的初期网络基础设施是很落后的,丢包的概率非常大的。而且这个过程也只是在通信前期建立连接的时候进行,3 次握手过后就是正常的消息传输了。
4 次挥手的目的跟 3 次握手目的是一样的,谨慎的确保双方消息状态的准确:
UDP 是一种不可靠的传输机制,但是它的数据报文比 TCP 小,所以相同数据的传输 UDP 所需的带宽更少,传输速度更快。它不要事先建立连接,知道对方的地址后直接数据包就扔过去,也不保证对方有没有收到。
我们知道 TCP 数据发送前要建立连接,UDP 不需要,而 Socket 的连接又有如下区分:
下面的实现了 Socket 的服务端服务和客户端,服务端在 6000 端口上面监听连接,收到客户端的连接后向客户端发出 hello
问候语,客户端打印出服务端发送过来的消息。
public class Server {
public static void main(String[] args) {
// 创建serverSocket监听本地的6000端口
try(ServerSocket server = new ServerSocket ()) {
// 当有客户端连接上就建立socket通道
Socket socket = server.accept();
OutputStream outputStream = socket.getOutputStream();
// 有客户端连接上来就主动发送问候语
outputStream.write("hello".getBytes());
outputStream.flush();
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public class Client {
public static void main(String[] args) {
// 根据{IP}+{port}与服务器建立连接
try( Socket socket=new Socket("127.0.0.1",)){
BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(socket.getInputStream()));
// 打印服务端发送的信息
Sy.out.println("Client:"+bufferedReader.readLine());
} catch (IOException e) {
e.printStackTrace();
}
}
}
Websocket 是一种版的 Http 服务,传统的 Http 服务都是客户端发起,服务端响应,而 Websocket 服务端向客户端主动推送消息,增强了浏览器的交互场景。Websocket 也是应用层协议,跟 Http 一样具体的实现都要基于 Socket,除此之外并没有什么特殊。
几乎所有的软件都需要通信,而几乎所有的通信都是基于 Socket 实现的,Socket 从软件的层面了传输层的细节,开发人员可以很方便的使用。Socket 起源于 Unix,而 Unix/Linux 基本哲学之一就是“一切皆”,使用的时候就打开,不用就。