zoukankan      html  css  js  c++  java
  • java入门16 -- http编程

    对于网络时代,我们有必要学习http编程,目前,我们只是简单学习一下客户端的请求,服务端的到时候可以使用框架来学习,这样才更加高效

    import java.io.*;
    import java.net.URI;
    import java.net.http.HttpClient;
    import java.net.http.HttpRequest;
    import java.net.http.HttpResponse;
    import java.time.Duration;
    
    public class HelloWorld {
    
        static HttpClient hc = HttpClient.newBuilder().build();
    
        public static void main(String[] args) throws Exception {
            // 网上随表找的福字,要过年啦
            String url = "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1578810765139&di=1af3228d51e29f5a1d61d12c387eb56c&imgtype=0&src=http%3A%2F%2Fpic.51yuansu.com%2Fpic3%2Fcover%2F02%2F42%2F72%2F59e4d3e5d8a7e_610.jpg";
            // 建立请求,默认是发送get请求
            HttpRequest request = HttpRequest.newBuilder(new URI(url))
                    .header("User-Agent", "Java HttpClient")
                    .header("Accept", "*/*")
                    .timeout(Duration.ofSeconds(5))
                    .version(HttpClient.Version.HTTP_2).build();
            // 发送请求,并获取响应对象
            HttpResponse<byte[]> response = hc.send(request, HttpResponse.BodyHandlers.ofByteArray());
            // 如果文件比较大,可以改写为流传输
            HttpResponse<InputStream> response2 = hc.send(request, HttpResponse.BodyHandlers.ofInputStream());
            // 将请求到的文件保存到本地,如果文件比较大,可以使用流传输,只需要将上面的 HttpResponse.BodyHandlers.ofByteArray(),
            try (OutputStream o = new FileOutputStream("./img.jpg")) {
                o.write(response.body());
            }
            // 然后使用流传输进行保存文件
            try (OutputStream o = new FileOutputStream("./img2.jpg")) {
                try (InputStream i = response2.body()) {
                    var b = new byte[10];
                    while (i.read(b) != -1) {
                        o.write(b);
                    }
                }
            }
        }
    }

    接下来看一下RMI的远程过程调用

    其实这个grpc原理差不太多,感觉grpc更强一点,跨平台使用,但是这个更切合java

    首先看一下server端,注意这个端口使双方信任的端口,千万不要暴露公网,以防被攻击

    import java.rmi.Remote;
    import java.rmi.RemoteException;
    import java.rmi.registry.LocateRegistry;
    import java.rmi.registry.Registry;
    import java.rmi.server.UnicastRemoteObject;
    
    // 这个需要继承Remote 以低昂需要抛出这个异常
    interface MyName extends Remote {
        String getName() throws RemoteException;
    }
    
    class MyNameService implements MyName {
        @Override
        public String getName() throws RemoteException {
            return "xiao hong";
        }
    
    }
    
    public class Server {
        public static void main(String[] args) throws Exception {
            // 首先起一个实例
            MyName myName = new MyNameService();
            // 然后开始将这个转化为远程接口
            MyName sn = (MyName) UnicastRemoteObject.exportObject(myName, 0);
            // 这个就是注册的端口,一般默认是1099,注意这个端口不要被别的占用
            Registry ry = LocateRegistry.createRegistry(1099);
            // 然后进行注册服务
            ry.rebind("MyName", sn);
        }
    }

    再看一下client端

    import java.rmi.registry.LocateRegistry;
    import java.rmi.registry.Registry;
    
    public class Client {
        public static void main(String[] args) throws Exception {
            // 首先进行连接
            Registry ry = LocateRegistry.getRegistry("127.0.0.1", 1099);
            // 然后查询这个注册的服务
            MyName myName = (MyName) ry.lookup("MyName");
            // 进行接口调用
            String name = myName.getName();
            System.out.println(name);
        }
    }
  • 相关阅读:
    线程 详解
    登录时,添加图片验证码
    String、StringBuffer、StringBuilder详解
    Random 生成随机数
    down
    九九归一
    小R与手机
    coins
    noip注意事项
    小W计树
  • 原文地址:https://www.cnblogs.com/yangshixiong/p/12182413.html
Copyright © 2011-2022 走看看