简单的网络调用

Posted nihaofenghao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了简单的网络调用相关的知识,希望对你有一定的参考价值。

自己在github上找的项目,是springforall社区的项目,自己写写,练练手

package com.fh.rpc;

public interface HelloService {
    
    public String hello(String message);

}
package com.fh.rpc;

public class HelloServiceImpl implements HelloService{

    @Override
    public String hello(String message) {
        return message+",it is Ok";
    }

    

}
package com.fh.rpc;

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.lang.reflect.Method;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;


public class Publish {

    static ExecutorService pool = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
    
    public static void publish(String host,int port) throws IOException {
        ServerSocket server = new ServerSocket();
        server.bind(new InetSocketAddress(host, port));
        try {
            while(true) {
                pool.execute(new ExecutorTask(server.accept()));    
            }
        }catch (Exception e) {
            e.printStackTrace();
        }finally {
            server.close();
        }
    }
    
    private static class ExecutorTask implements Runnable{
        
        public Socket socket;
        
        public ExecutorTask(Socket socket) {
            this.socket=socket;
        }

        @Override
        public void run() {
            ObjectInputStream input = null;
            ObjectOutputStream output = null;
            try {
                input = new ObjectInputStream(socket.getInputStream());
                
                String interfaceName = input.readUTF();
                String methodName = input.readUTF();
                Class<?>[] paramTypes = (Class<?>[])input.readObject();
                Object[] arguments = (Object[])input.readObject();
                Class<?> service = Class.forName(interfaceName);
                Method method = service.getMethod(methodName, paramTypes);
                Object result = method.invoke(service.newInstance(), arguments);
                
                output = new ObjectOutputStream(socket.getOutputStream());
                output.writeObject(result);
            }catch (Exception e) {
                e.printStackTrace();
            }finally {
                if(output!=null) {
                    try {
                        output.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                if(input!=null) {
                    try {
                        input.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                if(socket!=null) {
                    try {
                        socket.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
        
    }

}
package com.fh.rpc;

import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.net.InetSocketAddress;
import java.net.Socket;

public class CallRemote<S> {

    @SuppressWarnings("unchecked")
    public S callRemote(final Class<?> serviceClass,final InetSocketAddress address) {
        return (S)Proxy.newProxyInstance(serviceClass.getClassLoader(), new Class<?>[]{serviceClass.getInterfaces()[0]}, new InvocationHandler() {
            
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                Socket socket = null;
                ObjectOutputStream output = null;
                ObjectInputStream input = null;
                try {
                    socket = new Socket();
                    socket.connect(address);
                    
                    output = new ObjectOutputStream(socket.getOutputStream());
                    output.writeUTF(serviceClass.getName());
                    output.writeUTF(method.getName());
                    output.writeObject(method.getParameterTypes());
                    output.writeObject(args);
                    
                    input = new ObjectInputStream(socket.getInputStream());
                    return input.readObject();
                }catch (Exception e) {
                    e.printStackTrace();
                    return null;
                }finally {
                    if(socket!=null) {
                        socket.close();
                    }
                    if(input!=null) {
                        input.close();
                    }
                    if(output!=null) {
                        output.close();
                    }
                }
            }
        });
    }
}
package com.fh.rpc;

import java.io.IOException;
import java.net.InetSocketAddress;

public class RpcTest {

    public static void main(String[] args) {
        new Thread(new Runnable() {
            
            @Override
            public void run() {
                try {
                    Publish.publish("localhost", 8088);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }).start();
        
        CallRemote<HelloService> call = new CallRemote<>();
        
        HelloService hello = call.callRemote(HelloServiceImpl.class, new InetSocketAddress("localhost",8088));
        System.out.println(hello.hello("fenghao"));
    }

}

 

以上是关于简单的网络调用的主要内容,如果未能解决你的问题,请参考以下文章

20155311高梓云《网络对抗》逆向及Bof基础

20145301赵嘉鑫《网络对抗》逆向及Bof基础

Android:处理同步网络调用

nodejs常用代码片段

VSCode自定义代码片段14——Vue的axios网络请求封装

VSCode自定义代码片段14——Vue的axios网络请求封装