package com.bjmashibing.system.io.netty;
import io.netty.bootstrap.Bootstrap;
import io.netty.bootstrap.ServerBootstrap;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.PooledByteBufAllocator;
import io.netty.channel.*;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.nio.NioServerSocketChannel;
import io.netty.channel.socket.nio.NioSocketChannel;
import io.netty.handler.codec.ByteToMessageDecoder;
import org.junit.Test;
import java.io.*;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.net.InetSocketAddress;
import java.util.List;
import java.util.Random;
import java.util.UUID;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.atomic.AtomicInteger;
/**
- @author: 马士兵教育
- @create: 2020-07-12 20:08
-
- 12号的课开始手写RPC ,把前边的IO的课程都看看
- http://mashibing.com/vip.html#%E5%91%A8%E8%80%81%E5%B8%88%E5%86%85%E5%AD%98%E4%B8%8Eio%E7%A3%81%E7%9B%98io%E7%BD%91%E7%BB%9Cio
*/
/*
1,先假设一个需求,写一个RPC
2,来回通信,连接数量,拆包?
3,动态代理呀,序列化,协议封装
4,连接池
5,就像调用本地方法一样去调用远程的方法,面向java中就是所谓的 面向interface开发
*/
/**
-
上节课,基本写了一个能发送
-
小问题,当并发通过一个连接发送后,服务端解析bytebuf 转 对象的过程出错
*/
public class MyRPCTest {//多多包涵,如果一会翻车,请不要打脸。。。。。
@Test
public void startServer() {NioEventLoopGroup boss = new NioEventLoopGroup(20); NioEventLoopGroup worker = boss; ServerBootstrap sbs = new ServerBootstrap(); ChannelFuture bind = sbs.group(boss, worker) .channel(NioServerSocketChannel.class) .childHandler(new ChannelInitializer<NioSocketChannel>() { @Override protected void initChannel(NioSocketChannel ch) throws Exception { System.out.println("server accept cliet port: " + ch.remoteAddress().getPort()); ChannelPipeline p = ch.pipeline(); p.addLast(new ServerDecode()); p.addLast(new ServerRequestHandler()); } }).bind(new InetSocketAddress("localhost", 9090)); try { bind.sync().channel().closeFuture().sync(); } catch (InterruptedException e) { e.printStackTrace(); }
}
//模拟comsumer端
@Test
public void get() {new Thread(() -> { startServer(); }).start(); System.out.println("server started......"); AtomicInteger num = new AtomicInteger(0); int size = 50; Thread[] threads = new Thread[size]; for (int i = 0; i < size; i++) { thre