对于网络时代, 我们有必要学习 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://pic.51yuansu.com/pic3/cover/02/42/72/59e4d3e5d8a7e_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);
- }
- }
来源: http://www.bubuko.com/infodetail-3377279.html