目录
IO流
IO流有几种,怎么分类的?
1.流按方向分
输入流,输出流
2.流按传输单位分
字节流,字符流
Java提供了四个基类
字节流中常用的有 文件、对象、二进制
FileInputStream字节流只能读Ascll码文件,文件中有中文都不能用它读
字符流中常用的有 文件、 一次读一行的缓冲流
字节 | 字符 | |
---|---|---|
输入流 | DataInputStream ObjectInputStream FileInputStream | BufferedReader FileReader |
输出流 | DataOutputStream ObjectOutputStream FileOutputStream | BufferedWriter FileReaderWriter |
序列化和反序列化
对象从内存写入磁盘(网络)的过程称为对象的持久化,也称为序列化
从磁盘(网络)中读取文件到内存还原为对象的过程称为反序列化
网络编程
通信协议分层模型
TCP和UDP的区别
1.TCP和UDP都属于传输层的协议
2.TCP是可靠的,UDP是不可靠的
3.TCP有拥塞机制,UDP没有
拥塞机制指的是根据当前网络状况动态调整传输速率
4.TCP有重传机制,UDP没有
如果TCP协议在传输过程中发生了丢包,TCP会重传保证数据包的完整性
三次握手和四次挥手
1.TCP协议通过三次握手建立连接,通过四次挥手断开连接,UDP协议没有
2.TCP协议如果握手失败,是不会发送数据包的,UDP直接就发
单工、半双工、全双工
1. 单工模式
在单工模式下,发送方可以发送数据,但发送方无法接收数据。这是一种单向通信。
2. 半双工模式
在半双工模式下,Sender 可以发送数据,也可以接收数据,但一次只能接收一个。这是双向定向通信,但一次一个。
3. 全双工模式
在全双工模式下,Sender 可以发送数据,也可以同时接收数据。同时是双向的定向通信。
长连接和短连接
长连接:指在一个TCP连接上可以连续发送多个数据包,在TCP连接保持期间,如果没有数据包发送,需要双方发检测包以维持此连接,一般需要自己做在线维持。
短连接:指通信双方有数据交互时,就建立一个TCP连接,数据发送完成后,则断开此TCP连接,一般银行都使用短连接。
比如http的,只是连接、请求、关闭,过程时间较短,服务器若是一段时间内没有收到请求即可关闭连接。
其实长连接是相对于通常的短连接而说的,也就是长时间保持客户端与服务端的连接状态。
长连接和短连接的区别:
1、长连接是client方与server方先建立连接,连接建立后不断开,而短连接的Client方与server每进行一次报文收发交易时才进行通讯连接;
2、短连接多用于操作频繁,点对点的通讯,而且长连接数不能太多的情况。
长连接与短连接的操作过程
通常的短连接操作步骤是:
连接→数据传输→关闭连接;
而长连接通常就是:
连接→数据传输→保持连接(心跳)→数据传输→保持连接(心跳)→……→关闭连接;
这就要求长连接在没有数据通信时,定时发送数据包(心跳),以维持连接状态,短连接在没有数据传输时直接关闭就行了
CS架构和BS架构
CS Client-Server 客户端服务器架构模型
CS架构的软件需要安装,更新的时候客服端和服务端都需要更新
BS Browser-Server 浏览器服务器架构模型
BS架构的软件不需要安装,只需要一个浏览器即可,更新的时候只需要更新服务器端,不需要更新客户端
服务端
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class Demo01 {
public static void main(String[] args) {
ServerSocket server = null; //服务端套接字对象指针
try {
System.out.println("服务器启动成功,监听8080端口,等待客户端输入");
//初始化服务端套接字对象,监听8080端口
server = new ServerSocket(8080);
//等待客户端的接入(此时线程处于阻塞状态)
//当有客户端接入后返回一个socket对象
Socket socket = server.accept();
System.out.println("客户端接入成功");
//获取输入流
InputStream is = socket.getInputStream();
//建立缓冲区数组,从输入流中读取客户端传输过来的数据
byte[] data = new byte[1024];
//从输入流中读取客户端传输过来的数据
int n = is.read(data);
//把字节数组编码为字符串
String str = new String(data,0,n);
//打印
System.out.println("客户端:" + str);
OutputStream os = socket.getOutputStream();
String back = "欢迎访问服务端!";
os.write(back.getBytes());
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
server.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
客户端
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
public class Demo02 {
public static void main(String[] args) {
Socket socket = null;
try {
//建立客户端套接字对象,此处发生三次握手
socket = new Socket("192.168.198.37",8080);
//获取客户端的输出流
OutputStream os = socket.getOutputStream();
String send = "hello";
os.write(send.getBytes());
//获取客户端的输入流
InputStream is = socket.getInputStream();
byte[] data = new byte[1024];
int n = is.read(data);
String str = new String(data,0,n);
System.out.println("服务端:" + str);
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
socket套接字的底层一定是字节流
可以包装成对象流,传输对象
可以包装成二进制流,传输二进制文件