java tcp粘包_socket拆包与组班

java tcp粘包_socket拆包与组班importjava.nio.ByteBuffer;importio.netty.bootstrap.ServerBootstrap;importio.netty.buffer.ByteBuf;importio.netty.buffer.Unpooled;importio.netty.channel.ChannelFuture;importio.netty.channel.Channe…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

44ff9330108307659dcbcb3cbe1f3c8c.png

f81aacb62919f94e4faffda868e5c64f.png

import java.nio.ByteBuffer;

import io.netty.bootstrap.ServerBootstrap;

import io.netty.buffer.ByteBuf;

import io.netty.buffer.Unpooled;

import io.netty.channel.ChannelFuture;

import io.netty.channel.ChannelInitializer;

import io.netty.channel.ChannelOption;

import io.netty.channel.EventLoopGroup;

import io.netty.channel.nio.NioEventLoopGroup;

import io.netty.channel.socket.SocketChannel;

import io.netty.channel.socket.nio.NioServerSocketChannel;

import io.netty.handler.codec.DelimiterBasedFrameDecoder;

import io.netty.handler.codec.FixedLengthFrameDecoder;

import io.netty.handler.codec.string.StringDecoder;

import io.netty.handler.codec.string.StringEncoder;

public class Server {

public static void main(String[] args) throws Exception{

//1 创建2个线程,一个是负责接收客户端的连接。一个是负责进行数据传输的

EventLoopGroup pGroup = new NioEventLoopGroup();

EventLoopGroup cGroup = new NioEventLoopGroup();

//2 创建服务器辅助类

ServerBootstrap b = new ServerBootstrap();

b.group(pGroup, cGroup)

.channel(NioServerSocketChannel.class)

.option(ChannelOption.SO_BACKLOG, 1024)

.option(ChannelOption.SO_SNDBUF, 32*1024)

.option(ChannelOption.SO_RCVBUF, 32*1024)

.childHandler(new ChannelInitializer() {

@Override

protected void initChannel(SocketChannel sc) throws Exception {

//设置特殊分隔符

ByteBuf buf = Unpooled.copiedBuffer(“$_”.getBytes());

sc.pipeline().addLast(new DelimiterBasedFrameDecoder(1024, buf));

//设置字符串形式的解码

sc.pipeline().addLast(new StringDecoder());

sc.pipeline().addLast(new ServerHandler());

}

});

//4 绑定连接

ChannelFuture cf = b.bind(8765).sync();

//等待服务器监听端口关闭

cf.channel().closeFuture().sync();

pGroup.shutdownGracefully();

cGroup.shutdownGracefully();

}

}

import io.netty.bootstrap.Bootstrap;

import io.netty.buffer.ByteBuf;

import io.netty.buffer.Unpooled;

import io.netty.channel.ChannelFuture;

import io.netty.channel.ChannelInitializer;

import io.netty.channel.EventLoopGroup;

import io.netty.channel.nio.NioEventLoopGroup;

import io.netty.channel.socket.SocketChannel;

import io.netty.channel.socket.nio.NioSocketChannel;

import io.netty.handler.codec.DelimiterBasedFrameDecoder;

import io.netty.handler.codec.FixedLengthFrameDecoder;

import io.netty.handler.codec.string.StringDecoder;

import io.netty.handler.codec.string.StringEncoder;

public class Client {

public static void main(String[] args) throws Exception {

EventLoopGroup group = new NioEventLoopGroup();

Bootstrap b = new Bootstrap();

b.group(group)

.channel(NioSocketChannel.class)

.handler(new ChannelInitializer() {

@Override

protected void initChannel(SocketChannel sc) throws Exception {

//

ByteBuf buf = Unpooled.copiedBuffer(“$_”.getBytes());

sc.pipeline().addLast(new DelimiterBasedFrameDecoder(1024, buf));

sc.pipeline().addLast(new StringDecoder());

sc.pipeline().addLast(new ClientHandler());

}

});

ChannelFuture cf = b.connect(“127.0.0.1”, 8765).sync();

cf.channel().writeAndFlush(Unpooled.wrappedBuffer(“bbbb$_”.getBytes()));

cf.channel().writeAndFlush(Unpooled.wrappedBuffer(“cccc$_”.getBytes()));

//等待客户端端口关闭

cf.channel().closeFuture().sync();

group.shutdownGracefully();

}

}

import io.netty.buffer.Unpooled;

import io.netty.channel.ChannelHandlerAdapter;

import io.netty.channel.ChannelHandlerContext;

public class ServerHandler extends ChannelHandlerAdapter {

@Override

public void channelActive(ChannelHandlerContext ctx) throws Exception {

System.out.println(” server channel active… “);

}

@Override

public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {

String request = (String)msg;

System.out.println(“Server :” + msg);

String response = “服务器响应:” + msg + “$_”;

ctx.writeAndFlush(Unpooled.copiedBuffer(response.getBytes()));

}

@Override

public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {

}

@Override

public void exceptionCaught(ChannelHandlerContext ctx, Throwable t) throws Exception {

ctx.close();

}

}

import io.netty.channel.ChannelHandlerAdapter;

import io.netty.channel.ChannelHandlerContext;

import io.netty.util.ReferenceCountUtil;

public class ClientHandler extends ChannelHandlerAdapter{

@Override

public void channelActive(ChannelHandlerContext ctx) throws Exception {

System.out.println(“client channel active… “);

}

@Override

public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {

try {

String response = (String)msg;

System.out.println(“Client: ” + response);

} finally {

ReferenceCountUtil.release(msg);

}

}

@Override

public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {

}

@Override

public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {

ctx.close();

}

}

4c2bb1f0b41aeeb90abf3bd93e911554.png

import io.netty.bootstrap.ServerBootstrap;

import io.netty.channel.ChannelFuture;

import io.netty.channel.ChannelHandler;

import io.netty.channel.ChannelInitializer;

import io.netty.channel.ChannelOption;

import io.netty.channel.EventLoopGroup;

import io.netty.channel.nio.NioEventLoopGroup;

import io.netty.channel.socket.SocketChannel;

import io.netty.channel.socket.nio.NioServerSocketChannel;

import io.netty.handler.logging.LogLevel;

import io.netty.handler.logging.LoggingHandler;

import io.netty.handler.timeout.ReadTimeoutHandler;

public class Server {

public Server() {

}

public static void main(String[] args) throws Exception {

EventLoopGroup pGroup = new NioEventLoopGroup();

EventLoopGroup cGroup = new NioEventLoopGroup();

ServerBootstrap b = new ServerBootstrap();

((ServerBootstrap)((ServerBootstrap)((ServerBootstrap)b.group(pGroup, cGroup).channel(NioServerSocketChannel.class)).option(ChannelOption.SO_BACKLOG, 1024)).handler(new LoggingHandler(LogLevel.INFO))).childHandler(new ChannelInitializer() {

protected void initChannel(SocketChannel sc) throws Exception {

sc.pipeline().addLast(new ChannelHandler[]{MarshallingCodeCFactory.buildMarshallingDecoder()});

sc.pipeline().addLast(new ChannelHandler[]{MarshallingCodeCFactory.buildMarshallingEncoder()});

sc.pipeline().addLast(new ChannelHandler[]{new ReadTimeoutHandler(5)});

sc.pipeline().addLast(new ChannelHandler[]{new ServerHandler()});

}

});

ChannelFuture cf = b.bind(8765).sync();

cf.channel().closeFuture().sync();

pGroup.shutdownGracefully();

cGroup.shutdownGracefully();

}

}

import io.netty.bootstrap.Bootstrap;

import io.netty.channel.ChannelFuture;

import io.netty.channel.ChannelHandler;

import io.netty.channel.ChannelInitializer;

import io.netty.channel.EventLoopGroup;

import io.netty.channel.nio.NioEventLoopGroup;

import io.netty.channel.socket.SocketChannel;

import io.netty.channel.socket.nio.NioSocketChannel;

import io.netty.handler.logging.LogLevel;

import io.netty.handler.logging.LoggingHandler;

import io.netty.handler.timeout.ReadTimeoutHandler;

import java.util.concurrent.TimeUnit;

public class Client {

private EventLoopGroup group;

private Bootstrap b;

private ChannelFuture cf;

public static Client getInstance() {

return Client.SingletonHolder.instance;

}

private Client() {

this.group = new NioEventLoopGroup();

this.b = new Bootstrap();

((Bootstrap)((Bootstrap)((Bootstrap)this.b.group(this.group)).channel(NioSocketChannel.class)).handler(new LoggingHandler(LogLevel.INFO))).handler(new ChannelInitializer() {

protected void initChannel(SocketChannel sc) throws Exception {

sc.pipeline().addLast(new ChannelHandler[]{MarshallingCodeCFactory.buildMarshallingDecoder()});

sc.pipeline().addLast(new ChannelHandler[]{MarshallingCodeCFactory.buildMarshallingEncoder()});

sc.pipeline().addLast(new ChannelHandler[]{new ReadTimeoutHandler(5)});

sc.pipeline().addLast(new ChannelHandler[]{new ClientHandler()});

}

});

}

public void connect() {

try {

this.cf = this.b.connect(“127.0.0.1”, 8765).sync();

System.out.println(“远程服务器已经连接, 可以进行数据交换..”);

} catch (Exception var2) {

var2.printStackTrace();

}

}

public ChannelFuture getChannelFuture() {

if (this.cf == null) {

this.connect();

}

if (!this.cf.channel().isActive()) {

this.connect();

}

return this.cf;

}

public static void main(String[] args) throws Exception {

final Client c = getInstance();

ChannelFuture cf = c.getChannelFuture();

for(int i = 1; i <= 3; ++i) {

Request request = new Request();

request.setId(“” + i);

request.setName(“pro” + i);

request.setRequestMessage(“数据信息” + i);

cf.channel().writeAndFlush(request);

TimeUnit.SECONDS.sleep(4L);

}

cf.channel().closeFuture().sync();

(new Thread(new Runnable() {

public void run() {

try {

System.out.println(“进入子线程…”);

ChannelFuture cf = c.getChannelFuture();

System.out.println(cf.channel().isActive());

System.out.println(cf.channel().isOpen());

Request request = new Request();

request.setId(“4”);

request.setName(“pro4”);

request.setRequestMessage(“数据信息4”);

cf.channel().writeAndFlush(request);

cf.channel().closeFuture().sync();

System.out.println(“子线程结束.”);

} catch (InterruptedException var3) {

var3.printStackTrace();

}

}

})).start();

System.out.println(“断开连接,主线程结束..”);

}

private static class SingletonHolder {

static final Client instance = new Client((Client)null);

private SingletonHolder() {

}

}

}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/169721.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • mysql != 索引_Mysql语法

    mysql != 索引_Mysql语法转:https://www.cnblogs.com/huanzi-qch/p/15238604.html介绍通常情况下,全文检索引擎我们一般会用ES组件(传送门:SpringBoot系列——ElasticSearch),但不是所有业务都有那么大的数据量、那么大的并发要求,MySQL5.7之后内置了ngram分词器,支持中文分词,使用全文索引,即可实现对中文语义分词检索MySQL支持全文索引和搜索:  MySQL中的全文索引是FULLTEXT类型的索引。  全文索引只能用于InnoDB或My

    2022年8月24日
    26
  • drupal安装详解

    drupal安装详解drupal是一个非常优秀的cms开源框架,其实安装是非常简单的,和其他的php安装程序没什么大的不同。。。我使用的wamp集成环境,现在我想安装drupal中文版的,所以现在我要去下载drupal和中文汉化文件。。。1.到http://drupal.org/project/drupal下载drupal,到http://localize.drupal.org/translate/langu…

    2022年7月20日
    23
  • 王思聪新浪微博微博_kimi乔任梁王思聪

    王思聪新浪微博微博_kimi乔任梁王思聪作者|天使不投资人本文经授权转载自虎嗅APP(ID:huxiu_com)iG夺冠了!iG夺冠了!——11月3日,社交媒体成为了年轻人欢乐的海洋,微博尤甚。根本不知道LOL、也不知道iG是什么的叔叔阿姨们,对这次刷屏一点都不反感,毕竟IG老板,人称“校长”的王思聪,为了庆祝自家战队创造历史,在11月6日发起了一场豪气抽奖:从参与人数就可以隔着屏幕感受到一万元奖金的巨大…

    2022年8月30日
    8
  • apache 负载均衡 超时设置_apache负载均衡配置

    apache 负载均衡 超时设置_apache负载均衡配置最近因为新疆移动项目的要求,必须要用负载均衡来实现HTTP请求,没办法,我这个人一般是有压力的环境下才会好好学习,所以只有老实的自己来边学边写了。   其实,我们在平时经常听说集群这个名词,但是真正知道的又有几个呢,恩,好了,不讲废话了,我就先给大家扫盲吧,当然,我讲的不一定是对的,我就把我自己知道的讲出来,集群目前分3类吧,科学集群、高可用性集群、负载均衡集群。    科学集群(ScientificClustering,简称SC):使用特殊的软硬件技术将大量的计算能力有限的机器连接成计算能力巨大

    2025年9月4日
    8
  • 解决Virtual Box 安装Mac OS X当出现“hfs: summary table not allowed on FS with block size of 2048”问题

    解决Virtual Box 安装Mac OS X当出现“hfs: summary table not allowed on FS with block size of 2048”问题

    2022年1月4日
    46
  • UNIX基本操作命令

    UNIX基本操作命令UNIX命令基础登录系统:输入密码,密码不显示退出系统:ctrl+dexitlogout创建/修改密码:passwd密码输入后不显示,新密码要输入两次,匹配成功才算是修改密码成功UNIX命令格式:命令选项参数快捷键:ctrl+c:中断当前命令执行并返回shellctrl+d:终端传输或结束文本编辑ctrl+s:临时中断命令的屏幕输出ctrl+q:恢复由ctrl+s的临时中断ctrl+u:清除输入的整个命令行backspace:删除某个错误输入的字符常用操作命令

    2022年5月31日
    434

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号