您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

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 基本哲学之一就是“一切皆”,使用的时候就打开,不用就。


联系我
置顶