首页 > 其他分享 >JTCR-网络-21

JTCR-网络-21

时间:2024-04-24 14:44:17浏览次数:21  
标签:JTCR 21 int URL 网络 String static InetAddress HttpClient

InetAddress

InetAddress 类用于封装 IP 地址或者域名,支持 IPv4 和 IPv6。

创建 InetAddress 对象需要使用工厂方法,因为没有提供显式构造器。工厂方法如下

static InetAddress getLocalhost();
static InetAddress getByName(String hostName);
// 一个域名对应多个 IP 地址时,返回这些地址构造的 InetAddress 对象
static InetAddress[] getAllByName(String hostName);
public static void main(String[] args) throws UnknownHostException {
    // 主机 ip 地址
    // InetAddress 输出格式:主机名称/ip地址
    InetAddress localHost = InetAddress.getLocalHost();
    System.out.println(localHost);

    // 域名 id 地址
    InetAddress bing = InetAddress.getByName("cn.bing.com");
    System.out.println(bing);

    // 域名对应的多个 ip 地址
    InetAddress[] bings = InetAddress.getAllByName("cn.bing.com");
    for( InetAddress e : bings) {
        System.out.println(e);
    }
}

getByAddress() 方法接收一个 IP 地址,返回一个 InetAddress 对象。

InetAddress 类有两个子类 Inet4AddressInet6Address,分别表示 IPv4 和 IPv6 地址。

TCP/IP 客户端 Sockets

socket 用于连接 I/O 系统和其他程序。

ServerSocket 类用于服务器,作为“监听器”,等待客户端的请求。Socket 类用于客户端,用于连接服务器 socket 和发起协议交换过程。

Socket 对象的创建隐式建立了客户端和服务器的连接。该对象的方法可以获取服务器的地址、端口号等信息。

Socket(String hostName, int port);
Socket(InetAddress ipAddress, int port);

getInputStream()getOutputStream() 方法用于获取和 Socket 关联的输入流、输出流。

InputStream getInputStream();
OutputStream getOutputStream();

关闭 socket 时,与它关联的 I/O 流也会关闭。

public static void m() {
  try (var s = new Socket("xx.xxx.com", 80)) {
    var in = s.getInputStream();
    var out = s.getOutputStream();
    byte[] buf = "send information".getBytes();
    // 发送
    out.write(buf);
    int c;
    // 读取响应
    while ((c = in.read()) != -1) {
      System.out.println((char)c);
    }
  }
}

URL

统一资源定位符(Uniform Resource Locator,URL)唯一标识网络中某个资源的地址。

URL 由 4 部分构成,第一个部分是使用的协议;第二个部分是主机名或 IP 地址;第三个部分是端口号,可选;第四个部分是文件的实际路径。

常用构造器如下

URL(String urlSpecifier);
URL(String protocol, String host, int port, String path);
URL(String protocol, String host, String path);
URL(URL url, String urlSpecifier);
public static void main(String[] args) throws MalformedURLException {
    URL url = new URL("https://cn.bing.com");
    System.out.println(url.getHost());
    // 没有指定端口时返回 -1
    System.out.println(url.getPort());
}

为了获取 URL 对象表示的信息,需要调用 openConnection() 方法获取 URLConnection 对象。

URL Connection

URLConnection 类用于访问远程资源属性。这些属性由 HTTP 协议指定。URLConnection 对象的方法主要用于获取 HTTP 头属性,比如 getHeaderFields() 方法返回所有 HTTP 头属性,由 map 存储。

public static void main(String[] args) throws Exception {
    URL url = new URL("http://www.internic.net");
    URLConnection urlC = url.openConnection();
    System.out.println(urlC.getContentType());
    System.out.println(urlC.getContentEncoding());
}

HttpURLConnection

HttpURLConnection 类是 URLConnection 的子类,用于 HTTP 连接。调用 openConnection() 方法然后将返回结果显示转换成 HttpURLConnection 类得到 HttpURLConnection 对象。需保证打开的连接是 HTTP 连接。

public static void m() {
  var u = new URL("http://xxx.xx.com");
  var huc = (HttpURLConnection)u.openConnection();
  Map<String, List<String>> header = huc.getHeaderFields();
  Set<String> keys = header.keySet();
  for (String k : keys) {
    System.out.println(k + " : " + header.get(k));
  }
}

URI 类封装了统一资源标识符(Uniform Resource Identifier,URI)。URI 是表示资源的标准方式,URL 是它的子集。

TCP/IP Server Sockets

ServerSocket 对象用于监听是否有本地或者远程的程序连接自己发布的端口。

ServerSocket 的构造器可以指定队列长度。默认是 50。表示当请求的数量小于等于该队列容量时可以得到处理,大于时,后到达的拒绝连接。构造器如下

// 指定监听的端口号
ServerSocket(int port);
ServerSocket(int port, int maxQueue);
// 允许时,该对象与指定地址绑定
ServerSocket(int port, int maxQueue, InetAddress localAddress);

accept() 调用后等待客户端发起通信,当接收到请求时,返回一个 Socket 用于和客户端通信。

Datagrams

数据报(Datagrams)是机器之间传输的一组信息,它发送之后,不保证目标方能否收到,收到的数据报是否正确。Java 在 UDP 协议上层实现了数据报,使用两个类:DatagramPacket 和 DatagramSocket。其中,DatagramPacket 是数据容器,DatagramSocket 提供了发送和接收 DatagramPacket 对象的机制。

DatagramSocket 类的构造器如下

// 和本机上任意一个未使用的端口号绑定
DatagramSocket();
DatagramSocket(int port);
DatagramSocket(int port, InetAddress ipAddress);
DatagramSocket(SocketAddress address);

SocketAddress 是抽象类,InetSocketAddress 是它的实现类,InetSocketAddress 类封装了 IP 地址和端口号。

两个重要方法如下

void send(DatagramPacket packet);
void receive(DatagramPacket packet);

send() 方法将分组 packet 发送到指定端口,receive() 方法等待接收分组。

DatagramPacket 类定义的构造器如下

// 指定接收数据的缓冲区和分组大小
DatagramPacket(byte[] data, int size);
// offset 指定数据在缓冲区开始存储的索引位置
DatagramPacket(byte[] data, int offset, int size);
// 指定接收方的 ip 地址和端口号
DatagramPacket(byte[] data, int size, InetAddress ipAddress, int port);
// 从 data 的 offset 索引位置开始传输数据
DatagramPacket(byte[] data, int offset, int size, InetAddress ip, int port);
class Demo {
  public static int sPort = ;
  public static int cPort = ;
  public static int bSize = 1024;
  public static byte[] buf = new byte[bSize];
  public static DatagramSocket ds;
  
  public static void server() {
    int pos = 0;
    while (true) {
      int c = System.in.read();
      switch(c) {
        case -1:
          System.out.println("quit");
          ds.close();
          break;
        case '\r':
          break;
        case '\n':
          ds.send(new DatagramPacket(buf, pos, InetAddress.getLocalHost(), cPort));
          pos = 0;
          break;
        default:
          buf[pos++] = (byte)c;
      }
    }
  }
  
  public static void client() {
    while (true) {
      var p = new DatagramPacket(buf, buf.length);
      ds.receive(p);
      System.out.println(new String(p.getData(), 0, p.getLength()));
    }
  }
  
  public static void main(String[] args) {
    if (args.length == 1) {
      ds = new DatagramSocket(sPort);
      server();
    } else {
      ds = new DatagramSocket(cPort);
      clien();
    }
  }
}

java.net.http

JDK11 引入了 java.net.http 包,这些新加入的 API 称为 HTTP 客户端 API。支持异步通信 、HTTP/2、流控制(flow control)、双向通信的 WebSocket 协议。

有 3 个核心的 HTTP 客户端 API,HttpClient 封装了 HTTP 客户端,提供发送请求和接收响应的方法;HttpRequest 封装了请求;HttpResponse 封装了响应。三者共同支持 HTTP 的请求和响应特性。

首先,创建 HttpClient 和 HttpRequest ,然后调用 HttpClient 的 send 方法发送 HttpRequest ,该方法返回响应,可以从响应中获取响应头和响应体。

HttpClient 封装了 HTTP 请求/响应机制,支持同步和异步通信。可以使用它发送请求和接收响应。

HttpClient 是一个抽象类,只能使用工厂方法获得实例。它的静态方法 newBuilder() 返回一个 HttpClient 建造者(builder),该建造者实现了 HttpClient.Builder 接口,这个接口提供了若干个用于配置 HttpClient 的方法。建造者调用 build() 方法创建并返回 HttpClient 实例。

// 使用默认配置创建 HttpClient 实例
HttpClient  hc = HttpClient.newBuilder().build();

HttpClient.Builder 接口定义的 followRedirects() 方法用于设置重定向,默认情况下不允许重定向。该方法的参数必须为 HttpClient.Redirect 枚举类型的值:ALWAYS、NEVER 和 NORMAL。NORMAL 表示允许重定向,除非从 https 站点重定向到 http 站点。

HttpClient.Builder b =
  HttpClient.newBuilder().followRedirects(HttpClient.Redirect.NORMAL);
HttpClient hc = b.build();

HttpClient 的静态方法 newHttpClient() 返回默认配置的 HttpClient 实例。

var hc = HttpClient.newHttpClient();

HttpClient 对象调用 send() 方法可以发送一个同步请求。

<T> HttpResponse<T> send(HttpRequest req, HttpResponse.BodyHandler<T> handler);

handler 表示如何处理返回的响应。

HttpRequest 抽象类封装了请求,HttpRequest 对象需要使用建造者创建。newBuilder() 方法返回建造者。

// 创建默认建造者
static HttpRequest.Builder newBuilder();
static HttpRequest.Builder newBuilder(URI uri);

HttpRequest.Builder 提供了若干方法用于设置请求,默认的请求方式是 GET。HttpRequest 对象的 method() 返回请求方式的字符串表示,建造者实例调用 build() 方法创建 HttpRequest 实例。

HttpResponse 接口的实现类封装了响应。

HttpResponse<T>

T 指定了体的类型。

请求发送后,会返回一个 HttpResponse 对象,有若干个方法用于访问响应信息。其中,body() 方法返回对体的引用,引用的类型由 send() 方法中 handler 指定。

T body()

int statusCode() 方法返回状态码;HttpHeaders headers() 方法返回响应头。HttpHeaders 类的 map() 方法以键值对的方式返回所有的响应头信息。

Map<String, List<String>> map()

HttpResponse.BodyHandler 接口的实现类处理响应,HttpResponse.BodyHandlers 类预定义了若干体处理工厂方法。

// 将响应体写入 fileName 指定的文件中,HttpResponse.body() 返回该文件的 Path 对象
static HttpResponse.BodyHandler<Path> ofFile(Path fileName);
// 将响应体和输入流绑定,HttpResponse.body() 返回该输入流的引用
static HttpResponse.BodyHandler<InputStream> ofInputStream();
// 将响应体转换成字符串,HttpResponse.body() 返回该字符串
static HttpResponse.BodyHandler<String> ofString();

使用 ofInputStream() 方法时,需要将流完全读取。

class N {
	public static void main(String[] args) {
    var hc = HttpClient.newHttpClient();
    var hq = HttpRequest.newBuilder(new URI("http://www.xxx.com/")).build();
    HttpResponse<InputStream> hr =
	  hc.send(hq, HttpResponse.BodyHandlers.ofInputStream());
    // 请求方法
    hq.method();
    // 响应状态码
    hr.statusCode();
    InputStream input = hr.body();
    int c;
    while ((c = input.read()) != -1) {
      System.out.println((char)c);
    }
  }
}

参考

[1] Herbert Schildt, Java The Complete Reference 11th, 2019.

标签:JTCR,21,int,URL,网络,String,static,InetAddress,HttpClient
From: https://www.cnblogs.com/xdreamc/p/17543271.html

相关文章

  • JTCR-探究 NIO-20
    nio支持面向缓冲区、基于通道(channel-based)的I/O操作方法。JDK9开始,包java.nio及其子包位于java.base模块。nio子系统不是为了取代面向流的I/O类。NIO基础nio系统构建在缓冲区(buffers)和通道之上。缓冲区用于存放数据,通道表示一个已打开的与I/O设备的连接。通过......
  • Docker(十四)-Docker四种网络模式
    Docker安装时会自动在host上创建三个网络,我们可用 dockernetworkls 命令查看:none模式,使用--net=none指定,该模式关闭了容器的网络功能。host模式,使用--net=host指定,容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。bridge模式,使用--net=bridge指定......
  • PeLK:101 x 101 的超大卷积网络,同参数量下反超 ViT | CVPR 2024
    最近,有一些大型内核卷积网络的研究,但考虑到卷积的平方复杂度,扩大内核会带来大量的参数,继而引发严重的优化问题。受人类视觉的启发,论文提出了外围卷积,通过参数共享将卷积的复杂性从\(O(K^{2})\)降低到\(O(\mathrm{log}K)\),有效减少90%以上的参数数量并设法将内核尺寸扩大到......
  • 网络流做题记录
    网络流的建图灵活,需要大量练习。一些常见套路:拆点:一般来说可以把一个点拆为一个入点和一个出点并连边,用于点边转化。连INF边:这种边不可能包含在最小割中,可以用来将点定向。建立超级源点和超级汇点:用于构建网络流模型。加辅助点:比较灵活,可以用于处理多种问题。做......
  • 网络流小记
    基本定义:网络:一张有向图。流量:经过一条边的流的大小,一条边\((u,v)\)的流量记为\(flow(u,v)\),一个网络的流量定义为\(∑f(s,x)\)。容量:一条边的流量上限,一条边\((u,v)\)的容量记为\(cap(u,v)\)。费用:经过一条边单位流量的所需费用,一条边\((u,v)\)的费用记为......
  • 第21章 控制器和视图(一)
    1准备工作添加包:dotnetaddpackageMicrosoft.AspNetCore.Mvc.Razor.RuntimeCompilation--version3.1.12开始使用视图2.1配置应用程序HTML响应是使用视图创建的,视图则是混合了HTML元素和C#表达式的文件。配置Startup来启用HTML响应。services.AddControllersWithVie......
  • 电力控制系统设计方案:923-6U CPCI的光纤网络电力控制系统
    6UCPCI的光纤网络电力控制系统 一、设备概述   柔性直流输电系统中用于控制与测量的FS系统,适用于风电和太阳能发电的并网快速数值计算和闭环控制,以及与直流输电系统的换流器有关的特殊控制功能,包括门控单元的信号处理。该控制板的最大响应周期为1us,可以适......
  • 无源RLC电路和阻抗匹配 part2:串并联网络变换+L型匹配
    串并联变换(以RL串联→并联为例)若使上述变换成立,串联支路(Ls、Rs)总阻抗应等于并联支路(Lp、Rp)总阻抗因为可得RC串联→并联:上述变换为窄带阻抗变换,仅在以w0为中心的窄带内成立L型匹配L型匹配所用元件较少,仅用两个无源器件即可构成(电容or电感),根据Rs和Rl的大小关系可分......
  • CVE-2021-34371 Neo4j-Shell 漏洞复现
    前言偶然的一次机会遇到了这个漏洞,决定在vulhub复现下,重要提醒:本次复现所需要的环境为java8kali更换java环境戳这里漏洞描述Neo4j到3.4.18(启用shell服务器)公开了一个RMI服务,该服务可以任意反序列化Java对象,例如通过setSessionVariable。攻击者可滥用此漏洞进行远程......
  • linux 网络 cat /proc/net/dev 查看测试网络丢包情况
    可以通过cat/proc/net/dev查看测试网络丢包情况,drop关键字,查看所有网卡的丢包情况 bytes:接口发送或接收的数据的总字节数packets:接口发送或接收的数据包总数errs:由设备驱动程序检测到的发送或接收错误的总数drop:设备驱动程序丢弃的数据包总数fifo:FIFO缓冲区错误的......