• Java基础学习总结(62)——Java中的流和Socket


    按行读入方式: BufferedReader();

    1.以行为读取单位,读取比较方便。 按行读一般都是字符读。

    BufferedReader和PrintWriter的内存分析图:

    JAVA学习笔记之​流,序列化,Socket和装饰者模型

    数据流: 输入 输出

    DataInputStream DataOutputStream

    对象流: 输入 输出

    ObjectInputStream ObjectOutputStream

    还必须的实现Serializable接口,是直接是一个规范,不用重写任何方法。

    序列化:将对象变为--------------------------->文件中数据

    反序列化:将文件中的数据------------------------>转换为对象

    Transient修饰的属性,不会被序列化到文件里,原来初始化的是什么值,最终保持的就是什么值。

    网络编程:

    socket翻译:插座,插孔

    socket(套接字) = IP + 端口

    Scoket是伯克利大学弄出来的。

    网络编程 != 网站编程(我们从事的,专业一点就是 WEB应用程序开发)。

    Socket插座:

    Why:

    类似两个QQ聊天工具,两个应用程序之间要交换数据就要用到socket.

    What:Socket是一套API的总称,这套API是用来处理两个应用程序之间的数据交换的问题。

    How: 1.创建socket的连接

    2.I/O操作

    3.关闭socket的连接

    ServerSocket 服务器端插座

    Socket 客户端插座

    端口号:用来识别一个进程,端口号占两个字节 有65536种可能.TCP有65536、UDP也有65536个

    需求:客户端给服务器端说: 你好,服务器

    Server端代码

    import java.io.BufferedReader;

    import java.io.IOException;

    import java.io.InputStream;

    import java.io.InputStreamReader;

    import java.net.ServerSocket;

    import java.net.Socket;

    //服务器端

    public class Server {

    public static void main(String[] args) throws IOException {

    //Socket编程 共三步 类似打电话

    //一.创建socket连接 (拨号并接通)

    //1.新建ServerSocket

    ServerSocket ss = new ServerSocket(6666);

    //3.接受连接

    while(true){

    Socket socket = ss.accept();//阻塞式的 傻傻的等待 等待一个客户端连接

    System.out.println("有一个客户端相连");

    //二.I/O操作 (说话)

    //1.建立通道

    InputStream is = socket.getInputStream();

    InputStreamReader isr = new InputStreamReader(is);

    BufferedReader br = new BufferedReader(isr);

    //2.利用read读

    String message = br.readLine();//阻塞式 傻傻的等待 等待客户端写

    System.out.println("有客户端给我打招呼,内容是:" + message);

    //3.关闭通道

    if(br!=null){

    br.close();

    }

    if(isr!=null){

    isr.close();

    }

    if(is!=null){

    is.close();

    }

    //三.关闭socket连接 (挂电话)

    if(socket!=null){

    socket.close();

    }

    }

    //阻塞 为了等待客户端连接

    //有一个客户端相连

    //阻塞 为了等待客户端输出 等待6秒

    //有客户端给我打招呼,内容是:你好,服务器

    }

    }

    客户端代码

    import java.io.BufferedWriter;

    import java.io.IOException;

    import java.io.OutputStream;

    import java.io.OutputStreamWriter;

    import java.net.Socket;

    import java.net.UnknownHostException;

    //客户端

    public class Client {

    public static void main(String[] args) throws UnknownHostException,

    IOException,InterruptedException {

    String str = "你好,服务器";

    // 一.创建socket连接

    // 2.申请连接(相当于拨号,但别人不一定接) 系统给该进程自动分配一个端口1024以上

    Socket s = new Socket("127.0.0.1", 6666);

    //二.I/O操作

    //1.建立通道

    OutputStream oo = s.getOutputStream();

    //字节流--->字符流

    OutputStreamWriter osw = new OutputStreamWriter(oo);

    BufferedWriter bw = new BufferedWriter(osw);

    Thread.sleep(6000);

    //2.利用write写

    bw.write(str);

    //3.关闭通道

    if(bw!=null){

    bw.close();

    }

    if(osw!=null){

    osw.close();

    }

    if(oo!=null){

    oo.close();

    }

    //三.关闭socket连接

    if(s!=null){

    s.close();

    }

    }

    }

    注:Scoket socket = serverSocket.accept(); //阻塞式的,没有客户端连接服务器,这条代码就一直傻傻的等待,只有客户端申请连接后,才能解除阻塞。

    String message = br.readLine(); // 阻塞式的,等待客户端输出信息,才能解除阻塞。

    装饰者设计模式:在不改变原来类文件的情况下,添新功能。可以使用继承,但是在新功能较多的时候,容易发生类爆炸。

    1.实现原始类的 接口 因为原始的类的功能都只有那么一个,不会改变。

    2.组合现有的接口

    3.在原有的功能上添加新功能

    //装饰者类如何写

    //1.实现 原始类 接口 因为如何装饰 都是一个披萨

    public class SeafoodDecorator implements Pizza{

    //2.组合现有的

    private Pizza pizza;

    public SeafoodDecorator(Pizza pizza){

    this.pizza = pizza;

    }

    @Override

    public void describe() {

    //3.在原有的基础上添加的新功能(在原有的披萨上加调料)

    System.out.print("海鲜的");

    pizza.describe();// 为了保证原有的不变 所以要调用一下

    }

    }

    面试题1: BufferedWriter和PrintWriter的区别?

    答:PrintWriter的缓冲区只是文件一行

    BufferedWriter的缓冲区是16384字节

    按照是否直接和数据相连分为:节点流,处理流

    按照数据的流向分为:输入流,输出流

    按照数据单位分为:字节流,字符流

    面试题2: 什么时候将缓冲区中的内容写到文件中去?

    答:1.flush();时,刷新缓冲区;

    2.close();时,关闭通道,回自动调用flush();

    3.缓冲区中的数据已满时,回溢出到文件中去。缓冲区的大小是16384个字节。

  • 相关阅读:
    jenkins, docker-composer
    php pass-by-reference deprecated &$-->$
    showslow / YSlow for PhantomJS/slimerjs(gecko)/phantomas
    FW qunit introduction
    FW: AMD, CMD, CommonJS和UMD
    nodejs unit test related----faker-cli, sinonjs, mock/stub
    cs api测试
    CloudStack 4.3功能前瞻
    devcloud
    DevCloud for CloudStack Development
  • 原文地址:https://www.cnblogs.com/zhanghaiyang/p/7212877.html
Copyright © 2020-2023  润新知