JAVA学习DAY-16

目录

IO流

IO流有几种,怎么分类的?

Java提供了四个基类

序列化和反序列化

网络编程

通信协议分层模型

TCP和UDP的区别

三次握手和四次挥手

单工、半双工、全双工

长连接和短连接

CS架构和BS架构


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套接字的底层一定是字节流

可以包装成对象流,传输对象

可以包装成二进制流,传输二进制文件

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值