一种根据自定义分隔符分包的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());
}
}
复制代码

原文 

https://juejin.im/post/5e8d7a24e51d4546d32bcd13

本站部分文章源于互联网,本着传播知识、有益学习和研究的目的进行的转载,为网友免费提供。如有著作权人或出版方提出异议,本站将立即删除。如果您对文章转载有任何疑问请告之我们,以便我们及时纠正。

PS:推荐一个微信公众号: askHarries 或者qq群:474807195,里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多

转载请注明原文出处:Harries Blog™ » 一种根据自定义分隔符分包的Java实现

赞 (0)
分享到:更多 ()

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址