IO流基础网络IO

Posted 烟锁迷城

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了IO流基础网络IO相关的知识,希望对你有一定的参考价值。

1、网络IO基础

网络IO,即两个网络计算机之间的通讯,举一个简单的小例子,在server启动后,会进入到阻塞状态,client启动后,会通过socket将数据传输到server中,server会打印出数据。

public static void main(String[] args) {
    ServerSocket serverSocket = null;
    try {
        serverSocket = new ServerSocket(8080);
        Socket socket = serverSocket.accept();
        InputStream inputStream = socket.getInputStream();
        int len = 0;
        byte[] bytes = new byte[1024];
        while ((len = inputStream.read(bytes)) != -1) {
            System.out.println(new String(bytes, 0, len,"utf-8"));
        }
        inputStream.close();
        socket.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}
public static void main(String[] args) {
    try {
        Socket socket = new Socket("localhost", 8080);
        OutputStream outputStream = socket.getOutputStream();
        outputStream.write("Hello World".getBytes("utf-8"));
        outputStream.close();
        socket.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

 2、Socket与ServerSocket

ServerStock使用于服务端,对外提供一个监听,处于阻塞状态,等待客户端的连接,一旦获得连接,就会创造一个Socket实例。

Socket使用于客户端,连接到指定的ServerSocket。

ServerSocket开启监听,等待client响应,获取到消息后,发送返回值,注意发送的数据需要\\n作为发送消息的结束,不然就会让某一端持续接收,不知道消息已经结束(因为使用了readLine方法)

    public static void main(String[] args) {
        ServerSocket serverSocket = null;
        try {
            serverSocket = new ServerSocket(8080);
            Socket socket = serverSocket.accept();
            BufferedReader bufferedReader = new BufferedReader(
                    new InputStreamReader(socket.getInputStream()));
            System.out.println(bufferedReader.readLine());
            BufferedWriter bufferedWriter = new BufferedWriter(
                    new OutputStreamWriter(socket.getOutputStream()));
            bufferedWriter.write("收到消息\\n");
            bufferedWriter.flush();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

 Client将消息发送给ServerSocket,同时获取ServerSocket的返回值。

    public static void main(String[] args) {
        try {
            Socket socket = new Socket("localhost", 8080);
            BufferedWriter bufferedWriter = new BufferedWriter(
                    new OutputStreamWriter(socket.getOutputStream()));
            bufferedWriter.write("你好!\\n");
            bufferedWriter.flush();
            BufferedReader bufferedReader = new BufferedReader(
                    new InputStreamReader(socket.getInputStream()));
            System.out.println(bufferedReader.readLine());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

Socket通讯原理如下: 

3、网络通信协议

发送请求流程: 

  • 传输层:表示当前的协议头,使用TCP协议传输
  • 网络层:增加IP头,IP地址是一个网卡在网络中的通讯地址,相当于门牌号
  • 数据链路层:增加MAC头,表示这个数据包要发送到的网卡地址,MAC地址是全局唯一的
  • 物理层:转化为比特流进行传输

接收请求流程:

  • 物理层:当数据通过网卡的时候,查看数据是否需要
  • 数据链路层:拿到数据,从数据中取得MAC头,检查MAC地址和当前网卡的MAC是否匹配,如果匹配说明当前消息是匹配的
  • 网络层:拿到IP头,判断IP地址是否匹配,如果不是就继续转发,如果是就转交给上一层
  • 传输层:TCP头中会携带端口,将报文交给指定端口的进程

4、网络通信原理

网络通信和本地的磁盘通信是一样的,只需要将磁盘替换为网络数据即可。

在ServerSocket中,accept方法对于请求的接收是阻塞的,InputStream和OutputStream在没有处理完成之前也是阻塞的,只要ServerSocket有正在处理的请求,其他Socket请求就无法被这个ServerSocket接收。

对于程序来说,串行的操作肯定是不被接受的,所以可以用线程池对上文的代码进行优化。

5、RPC架构

RPC(Remote Procedure Call)远程过程调用,是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。一般用来实现部署在不同机器上的系统之间的方法调用,使得程序能够像访问本地系统资源一样,通过网络传输去访问远端系统资源。

手写RPC框架下载

以上是关于IO流基础网络IO的主要内容,如果未能解决你的问题,请参考以下文章

IO流基础网络IO

java基础之IO流

Java基础IO流

java基础-JAVA IO

java基础之 IO 流(输入/出字符流)

Java IO流基础总结