[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!");
}
}
```
- 第一章 开篇寄语
- 1-1 技术选型要点
- 1-2 认识905.4王国的交流规范
- 1-3 联系作者
- 第二章 Socket编程的基础知识
- 2-1 Socket家族的基石
- 2-2 byte数组基础
- 2-3 缓冲区基础
- 2-4 NIO Socket通讯的工作原理
- 第三章 905.4规范解读
- 3-1 基于通道选择器的Socket长连接及消息读写框架
- 3-2 严格的信件收发员
- 3-3 负责消息处理的一家子
- 3-4 负责认证的大儿子(AuthWorker)
- 3-5 哑巴老二(PingWoker)
- 3-6 勤奋的定位汇报员老三(LocationReportWorker)
- 3-7 精明的老四(BusinessReportWorker)
- 3-8 数据检察官——CRC16-CCITT校验
- 3-11 数据的加密官
- 3-12 头尾标识转义
- 第四章 测试方法
- 4-1 测试数据样例
- 4-2 客户端链路保持功能实现
- 4-3 使用Socket短连接进行功能测试
- 4-4 NIO服务端性能分析
- 4-5 http测试方法(推荐)
- 第五章 从NIO到netty
- 5-1 编程进阶——Netty核心基础
- 5-2 Netty使用常见问题
- 5-3 使用Netty重写Server端
- 5-4 Netty之链路管理
- 5-5 netty堆外内存泄漏如何应对?
- 第六章 统计与监控
- 6-1 Grafana监控面板
- 第七章 售后服务
- 7-1 勘误与优化
- 7-2 获取源码