软件架构::
CS: Client客户端, Server服务器
BS: Browser浏览器, Server服务器
网络通信三要素
TCP通信协议/UDP协议
网络编程
Socket: 套接字 客户端
ServerSocket 服务端
网络通信协议:
通信协议是计算机必须遵守的规则, 只有遵守这些规则, 计算机之间才能进行通信.
协议中对数据的传输格式, 传输速率, 传输步骤等做了统一规定, 通信双方必须同时遵守, 最终完成数据交换 (类似于一种语言, 语法语速做了规定)
TCP/IP协议:
Transmission Control Protocol/Internet Protocol, 传输控制协议/因特网互联协议
它定义了计算机如何连入因特网, 以及数据如何在它们之间传输的标准. 它的内部包含一系列的用于处理数据通 信的协议, 并采用了4层的分层模型, 每一层都呼叫它的下一层所提供的协议来完成自己的需求
UDP: User Datagram Protocol, 用户数据报协议
特点:
1. 无连接的不可靠协议
2. 数据按包发送, 64K一个包
3. 速度快效率高, 容易丢包
用于视频直播, 网络电话
TCP: Transmission Control Protocol, 传输控制协议
特点:
1. 需要建立连接的可靠协议 电话
2. 数据传输无大小限制
3. 速度慢效率低 重发机制
用于文件下载, 浏览网页
TCP通信的三次握手: TCP协议中, 在发送数据的准备阶段, 客户端与服务器之间的三次交互, 以保证连接的可 靠
1. 客户端向服务端发送验证信息, 等待服务器确认
2. 服务端收到验证信息后, 回复客户端验证信息, 同时发送自己的一条验证信息
3. 客户端收到服务端回复的信息, 确认自己之前发的信息无误, 并再次向服务器发回服务端的验证信息
网络编程三要素:
1. 通信协议 TCP
2. IP地址
3. 端口号
特殊的IP地址: "127.0.0.1", "localhost", 都代表自己的电脑
端口号: 计算机中进程的唯一标识
端口号的取值范围: 0~65535的整数, 其中0~1024不建议使用
注意:
通信的两端是2个计算机中的2个程序在相互通信, 所以2个程序都要有端口号. 端口号可以相同, 也可以不同, 相互之间能识别就行
java.net.ServerSocket类: TCP服务端
// 构造方法
ServerSocket(int port): 创建一个TCP服务端, 并监听指定端口
// 成员方法
Socket accept(): 监听数据, 会阻塞. 收到数据后返回Socket对象
void close(): 关闭服务端ServerSocket
java.net.Socket类: TCP客户端
// 构造方法
Socket(String ip, int port): 创建TCP客户端对象
// 成员方法
OutputStream getOutputStream(): 获取输出流对象, 用于发送数据
InputStream getInputStream(): 获取输入流, 用于接收数据
void shutdownOutput(): 关闭输出流, 发送结束标记
void close(): 关闭客户端Socket
两端通信时步骤:
1. 服务端程序需要先启动, 等待客户端的连接
2. 客户端主动连接服务器端, 连接成功才能通信. 服务端不可以主动连接客户端
两端之间以 "IO字节流" 进行通信
一个服务端可以和多个客户端同时通信
服务端(ServerSocket)可以通过 accept() 方法等待一个客户端(Socket)主动连接, 从而得到一个客户端对象 (Socket), 来识别不同的客户端
服务端(ServerSocket)没有IO流, 是通过获取到"每个客户端对象(Socket)的IO流对象"来进行通信的.
使用"客户端的InputStream"读取客户端发来的数据
使用"客户端的OutputStream"向客户端回写数据
TCP程序代码实现
java.net.Socket类: TCP客户端
// 构造方法
Socket(String 服务端ip, int 服务端port): 创建TCP客户端对象, 同时尝试连接到指定的服务端
// 成员方法
OutputStream getOutputStream(): 获取输出流对象, 用于发送数据
InputStream getInputStream(): 获取输入流, 用于接收数据
void shutdownOutput(): 关闭输出流, 告知服务端数据发送完毕, 结束标记-1
void close(): 关闭客户端Socket, 告知服务端数据发送完毕
实现步骤:
1.创建一个客户端对象 Socket, 构造方法传入服务器的IP地址和端口号
2.使用Socket对象中的方法 getOutputStream() 获取网络字节输出流OutputStream对象
3.使用网络字节输出流OutputStream对象中的方法 write(), 给服务器发送数据
4.使用Socket对象中的方法 getInputStream() 获取网络字节输入流InputStream对象
5.使用网络字节输入流InputStream对象中的方法 read(), 读取服务器回写的数据
6.释放资源(Socket)
注意:
1.客户端和服务器端进行交互, 必须使用Socket中提供的网络流, 不能使用自己创建的流对象
2.当我们创建客户端对象Socket的时候, 就会去请求服务器和服务器经过3次握手建立连接通路
这时如果服务器没有启动, 那么就会抛出异常ConnectException: Connection refused: connect
如果服务器已经启动, 那么就可以进行交互了
// 创建客户端Socket对象, 指定要连接的服务端的IP和端口号
Socket socket = new Socket("127.0.0.1", 8888);
// 向服务端发送数据
OutputStream os = socket.getOutputStream();
os.write("你好服务器".getBytes());
// 释放资源
socket.close();