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);
    }
}
posted @ 2020-01-12 12:45  灬灬灬灬灬灬  阅读(456)  评论(0编辑  收藏  举报