欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java 基于BIO实现 Client与Server通信

程序员文章站 2022-05-23 08:36:41
...

基于BIO实现 Client与Server通信

1、简述BIO模型中服务端与客户端的响应过程

Java 基于BIO实现 Client与Server通信

根据上图可清晰看出,Client与Server的响应流程如下:

1、Server 服务器端 serverSocket先要和端口进行绑定

ServerSocket serverSocket = new ServerSocket(6767);  

2、绑定完成后,通过accept方法,阻塞式等待客户端的连接,这个方法是阻塞式调用,直到有客户端连接才往下执行;

 Socket accept = serverSocket.accept();

3、客户端创建Socket对象,绑定服务器的ip地址端口号,与服务器进行连接

 //建立socket连接  host=127.0.0.1   port=6767
socket = new Socket(host, port);

4、服务器接收到客户端的连接请求,accept方法获取到客户端的socket信息,连接成功
服务器与客户端创建各自的io流,实现全双工通信
Java 基于BIO实现 Client与Server通信

2、案例实现

客户端:

package com.xiaojie.net;

import java.io.*;
import java.net.Socket;

/**
 * @author Mrli
 * @date 2020/9/25 19:36
 */
public class Client {
    public static void main(String[] args) {
        final String host = "127.0.0.1";
        final int port = 6767;
        final String QUIT = "quit";

        Socket socket = null;
        BufferedReader reader = null;
        BufferedWriter writer = null;

        try {
            //建立socket连接
            socket = new Socket(host, port);

            //获取输入字符流
            reader = new BufferedReader(new InputStreamReader(
                    socket.getInputStream()
            ));

            //获取输出字符流
            writer = new BufferedWriter(new OutputStreamWriter(
                    socket.getOutputStream()
            ));

            //获取输入字符流
            BufferedReader scan = new BufferedReader(new InputStreamReader(System.in));

            while (true) {
                String msg = scan.readLine();

                //向服务器发送消息
                writer.write(msg + "\n");
                writer.flush();
			   
                //接收消息
                String line = reader.readLine();
                System.out.println("server:" + line);

                if (msg.equals(QUIT)) {
                    break;
                }
            }

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if(writer != null) {
                try {
                    writer.close();
                    System.out.println("Client close!");
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

    }
}

服务端:

package com.xiaojie.net;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * @author Mrli
 * @date 2020/9/25 19:37
 */
public class Server {
    public static void main(String[] args) {
        final int port = 6767;
        final String QUIT = "quit";
        ServerSocket serverSocket = null;

        try {
            serverSocket = new ServerSocket(port);
            System.out.println("服务器已启动,监听端口:" + port);

            while(true) {
                Socket accept = serverSocket.accept();
                System.out.println("客户端" + accept.getPort() + ":" + "已经连接");

                //获取输入字符流
                BufferedReader reader = new BufferedReader(new InputStreamReader(
                        accept.getInputStream()
                ));
                //获取输出字符流
                BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(
                        accept.getOutputStream()
                ));

                String msg = null;
                while ((msg = reader.readLine()) != null ) {
                    //接收消息
                    System.out.println("client[" + accept.getPort() + "]:" +msg);
                    
                    //转发到Client,
                    writer.write( msg + "\n");
                    writer.flush();

                    if(msg.equals(QUIT)) {
                        System.out.println("client close!");
                        break;
                    }
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if(serverSocket != null) {
                try {
                    serverSocket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}



运行结果:

client端:

Java 基于BIO实现 Client与Server通信

服务端:
Java 基于BIO实现 Client与Server通信





BIO学习到这里,后面IO学习继续更新!