一种根据自定义分隔符分包的Java实现

使用netty可以很简单的进行分包。

本文介绍一种使用JDK自带方法进行分包,支持Java或者Android端。

适用于socket、蓝牙、wifi通信。

1 socket沾包和拆包的表现形式

  1. 接收端正常收到两个数据包,即没有发生拆包和粘包的现象,此种情况不用做特殊处理。
  2. 接收端只收到一个数据包,包含了两个或者多个数据包,这种现象即为粘包,需要手动拆分。
  3. 一个数据包被拆分成多次发送,每次收到的都是不完整的数据包,这种称为拆包,需要手动组合。
  4. 拆包和沾包同时发生,比如发送两个数据包aaa和bbb,接收端收到两个数据包aa,abbb。

2 一种根据自定义分隔符分包的Java实现

2.1 如果分隔符是换行符\r或者\n或者\r\n

public static void main(String[] args) {
        String hostname = "127.0.0.1";
        int port = 5209;
        
        try (Socket socket = new Socket(hostname, port)) {
            OutputStream output = socket.getOutputStream();
            PrintWriter writer = new PrintWriter(output, true);
            writer.println("Hello,I am client");

            InputStream input = socket.getInputStream();
            BufferedReader reader = new BufferedReader(new InputStreamReader(input));
            String line;
            while ((line = reader.readLine()) != null) {
                System.out.println(line);
            }
        } catch (UnknownHostException ex) {
            System.out.println("Server not found: " + ex.getMessage());
        } catch (IOException ex) {
            System.out.println("I/O error: " + ex.getMessage());
        }
    }
复制代码

2.2 自定义分隔符,示例中使用ETX(0x03)作为分隔符

public static void main(String[] args) {
        String hostname = "127.0.0.1";
        int port = 5209;

        try (Socket socket = new Socket(hostname, port)) {
            OutputStream output = socket.getOutputStream();
            PrintWriter writer = new PrintWriter(output, true);
            writer.println("Hello,I am client");

            InputStream input = socket.getInputStream();
            Scanner scan = new Scanner(input);
            scan.useDelimiter(new String(new byte[]{0x03}));
            while (scan.hasNext()) {
                String line = scan.next();
                System.out.println(line);
            }
        } catch (UnknownHostException ex) {
            System.out.println("Server not found: " + ex.getMessage());
        } catch (IOException ex) {
            System.out.println("I/O error: " + ex.getMessage());
        }
    }
复制代码

猜你喜欢

转载自juejin.im/post/5e8d7a24e51d4546d32bcd13
今日推荐