package part2.Server.netty.handler; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.AllArgsConstructor; import part2.Server.provider.ServiceProvider; import part2.common.Message.RpcRequest; import part2.common.Message.RpcResponse; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; /** * @author wxx * @version 1.0 * @create 2024/2/26 16:40 * 因为是服务器端,我们知道接受到请求格式是RPCRequest * Object类型也行,强制转型就行 */ @AllArgsConstructor public class NettyRPCServerHandler extends SimpleChannelInboundHandler { private ServiceProvider serviceProvider; @Override protected void channelRead0(ChannelHandlerContext ctx, RpcRequest request) throws Exception { RpcResponse response = getResponse(request); ctx.writeAndFlush(response); ctx.close(); } @Override public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { cause.printStackTrace(); ctx.close(); } private RpcResponse getResponse(RpcRequest rpcRequest){ //得到服务名 String interfaceName=rpcRequest.getInterfaceName(); //得到服务端相应服务实现类 Object service = serviceProvider.getService(interfaceName); //反射调用方法 Method method=null; try { method= service.getClass().getMethod(rpcRequest.getMethodName(), rpcRequest.getParamsType()); Object invoke=method.invoke(service,rpcRequest.getParams()); return RpcResponse.sussess(invoke); } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) { e.printStackTrace(); System.out.println("方法执行错误"); return RpcResponse.fail(); } } }