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); } }