[TOC] > 说起905.4王国,Socket家族可谓功不可没。可以这么说,没有Socket家族的技术背景,905.4王国根本无从谈起。 本节总结一下,我们在学习Socket编程的时候,需要知道的一些基础性概念。 ## 一、什么是 socket? socket 的原意是“插座”,在计算机通信领域,socket 被翻译为“套接字”,它是计算机之间进行通信的一种约定或一种方式。通过socket这种约定,一台计算机可以接收其他计算机的数据,也可以向其他计算机发送数据。 socket 的典型应用就是Web服务器和浏览器:浏览器获取用户输入的 URL,向服务器发起请求,服务器分析接收到的 URL,将对应的网页内容返回给浏览器,浏览器再经过解析和渲染,就将文字、图片、视频等元素呈现给用户。 ### Socket通讯的基础流程 ```[sequence] client->>server: ①Can you help me?然后client会进入到阻塞状态 server->>server: ②Got!处理一些业务逻辑 server->>client: ③result is xxxxx ``` ### 缓冲区(Buffer) 每个 socket 被创建后,都会分配两个缓冲区,输入缓冲区和输出缓冲区。 ![](https://img.kancloud.cn/66/49/66492a65532e4314ede8d946ab1f172e_697x210.png) 这些I/O缓冲区特性可整理如下: - I/O缓冲区在每个TCP套接字中单独存在; - I/O缓冲区在创建套接字时自动生成; - 即使关闭套接字也会继续传送输出缓冲区中遗留的数据; - 关闭套接字将丢失输入缓冲区中的数据。 ### 单播、广播、多播 - 单播。所谓的单播大多数都是点对点式的网络,如打开网页、发送邮件和两人网络聊天等情况,都是在使用点对点方式传输数据。 - 广播。广播是一种一对多的形式,是对网络中所有的计算机发送数据,不区分目标,这就极易造成网络中存在大量无用的垃圾通信数据,造成“广播风暴”,使网络变慢,严重时网络会彻底瘫痪。 - 多播也称为组播,它也是一种一对多的网络。从组播的名字来看,它可以对某些计算机分配多播类型的IP地址以进行分组,然后只针对这些计算机发送数据,这就是多播。 ## 二、Socket的基础操作 实现基础的Socket通信,我们需要核心关注两个类的使用: - ServerSocket:ServerSocket类作用是搭建Socket的服务端环境; - Socket:Socket类的主要作用是使Server与Client进行通信。 ### ServerSocket类 > ServerSocket类作用是搭建Socket的服务端环境。 **构造函数** 构造参数backlog - 主要作用就是允许接受客户端连接请求的个数。其本质是设置最大等待队列长度,如果队列已满,则拒绝该连接。 - 默认值50。 ```java public ServerSocket(int port,int backlog) ; ``` ### Socket > Socket类的主要作用是使Server与Client进行通信。 **常用方法** - `public void bind (SocketAddress bindpoint)`,作用将套接字绑定到本地地址,否则系统将自动分配端口号。 - `connect()`方法,连接方法,用于客户端与服务端建立连接。 **示例代码** 服务端: ```java import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; /** * 服务端与客户端成功地进行通信 * Created by zihan on 2021/4/26. * connect to cowboy2014@qq.com */ public class BeginServer { public static void main(String[] args) throws IOException { ServerSocket serverSocket = new ServerSocket(8888); Socket socket = serverSocket.accept(); //结束socket通信 socket.close(); //关闭socket服务 serverSocket.close(); System.out.println("server closed!"); } } ``` 客户端: ```java /** * Created by zihan on 2021/5/28. * connect to cowboy2014@qq.com */ public class Client { public static void main(String[] args) throws IOException { Socket socket = new Socket(); socket.bind(new InetSocketAddress("127.0.0.1",7777)); socket.connect(new InetSocketAddress("127.0.1.1",8888)); socket.close(); System.out.println("client closed!"); } } ```