仿写Dubbo-Java Socket

概念

socket 被翻译为“套接字”,socket是计算机之间进行通信的一种方式。通过socket可以实现端(端口)到端通信。Java的java.net包中提供了进行socket通信的类。主要使用ServerSocket和Socket类实现通信。

ServerSocket

服务端应用使用java.net.ServerSocket类来获取端口并侦听客户端请求。

①使用ServerSocket(int port)构造函数创建服务端。

②使用.accept()函数来获取客户端(创建Socket对象)。

Socket

客户端应用使用java.net.Socket类来发送请求,并接收服务端请求。

①使用Socket(String host,int port)构造函数创建客户端。

②使用.getOutputStream()来获取OutputStream输出流。

③使用.getInputStream()来获取InputStream输入流。

InputStream

InputStream是位于java.io包中,Java标准库提供的最基本的同步输入流。

①使用.reda()方法读取流中的数据。

仿写Dubbo-Java Socket_第1张图片

            byte[] data = new byte[256];
            //读取流中的数据,放入到data里面
            inputStream.read(data);

②使用java.util.Scanner类读取数据也是可以的。

            Scanner scanner = new Scanner(inputStream);
            //读取一行数据
            String line = scanner.nextLine();

③使用.close()关闭输入流。

OutputStream

OutputStream是位于java.io包中,Java标准库提供的最基本的同步输出流。

①使用.write()方法往流里面写入数据。

仿写Dubbo-Java Socket_第2张图片

            String data = "数据\n";    //务必使用\n结尾
            outputStream.write(data.getBytes(StandardCharsets.UTF_8));

②使用.flush()方法完成写入。

③使用.close()关闭输出流。

一次通信

一次通信,服务端需要监听一次客户端,处理请求数据并作出响应。

创建服务端

public class Server {
    public static void main(String[] args) {
        ServerSocket socket = null;
        try {
            //创建socket服务并监听
            socket = new ServerSocket(2181);
            //接收请求
            Socket accept = socket.accept();
            //获取请求数据
            InputStream inputStream = accept.getInputStream();
            Scanner scanner = new Scanner(inputStream);
            String line = scanner.hasNext() ? scanner.nextLine() : "";
            //处理请求
            System.out.println(line);
            //做出响应
            OutputStream outputStream = accept.getOutputStream();
            line = "收到\n";
            outputStream.write(line.getBytes(StandardCharsets.UTF_8));
            outputStream.flush();

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

创建客户端

public class Client {
    public static void main(String[] args) {
        Socket socket = null;
        try {
            //连接服务端
            socket = new Socket("127.0.0.1", 2181);
            //发送请求
            OutputStream outputStream = socket.getOutputStream();
            String data = "数据\n";
            outputStream.write(data.getBytes(StandardCharsets.UTF_8));
            outputStream.flush();
            //接收响应数据
            InputStream inputStream = socket.getInputStream();
            Scanner scanner = new Scanner(inputStream);
            String line = scanner.hasNext() ? scanner.nextLine() : "";
            //处理响应数据
            System.out.println(line);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

测试

仿写Dubbo-Java Socket_第3张图片

仿写Dubbo-Java Socket_第4张图片

持续通信

持续通信,服务端需要持续监听客户端,处理请求并作出响应。只需要一个while循环即可实现。

创建服务端

public class Server {
    public static void main(String[] args) {
        ServerSocket socket = null;
        try {
            //创建socket服务并监听
            socket = new ServerSocket(2181);
            while (true) {
                //接收请求
                Socket accept = socket.accept();
                //获取请求数据
                InputStream inputStream = accept.getInputStream();
                Scanner scanner = new Scanner(inputStream);
                String line = scanner.hasNext() ? scanner.nextLine() : "";
                //处理请求
                System.out.println(line);
                //做出响应
                OutputStream outputStream = accept.getOutputStream();
                line = "收到\n";
                outputStream.write(line.getBytes(StandardCharsets.UTF_8));
                outputStream.flush();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

创建客户端

public class Client {
    public static void main(String[] args) {
        Socket socket = null;
        try {
            //连接服务端
            socket = new Socket("127.0.0.1", 2181);
            //发送请求
            OutputStream outputStream = socket.getOutputStream();
            String data = "数据\n";
            outputStream.write(data.getBytes(StandardCharsets.UTF_8));
            outputStream.flush();
            //接收响应数据
            InputStream inputStream = socket.getInputStream();
            Scanner scanner = new Scanner(inputStream);
            String line = scanner.hasNext() ? scanner.nextLine() : "";
            //处理响应数据
            System.out.println(line);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

测试

客户端启动三次发了三次请求。

仿写Dubbo-Java Socket_第5张图片

仿写Dubbo-Java Socket_第6张图片

你可能感兴趣的:(Dubbo/Cloud,java,websocket)