Java networking学习笔记(一):URL的构造函数


URL是典型的bridge设计模式

URL构造函数完成的工作

URL(String protocol, String host, String file)
URL(String protocol, String host, int port, String file)
URL(String protocol, String host, int port, String file, URLStreamHandler handler)

  1. 初始化属性protocol, host, port, authority, path, query, file, ref
    authority = host + ":" + port
    file = path + "?" + query
  2. 装配URLStreamHandler

URL(String spec)
URL(URL context, String spec)
URL(URL context, String spec, URLStreamHandler handler)

  1. 初始化属性protocol, authority, userInfo, host, port, file, path, query, ref.
    protocol, authority, userInfo, host, port, file, path属性从context复制
  2. 装配URLStreamHandler,
    使用handler来解析spec

静态工厂方法getURLStreamHandler(String protocol)

目的:创建URLStreamHandler

过程:

  1. 先从缓存里找,如果缓存里没有
  2. 如果URLStreamHandlerFactory存在,使用其工厂方法createURLStreamHandler(String protocol)创建,否则
  3. 读取java.protocol.handler.pkgs属性
    The property which specifies the package prefix list to be scanned for protocol handlers
    packagePrefixList += "sun.net.www.protocol"
  4. 遍历packagePrefixList,寻找packagePrefix + "." + protocol + ".Handler"类,
    使用反射创建URLStreamHandler实例
  5. 将URLStreamHandler实例放入缓存
  6. 返回URLStreamHandler实例

JDK内置的URLStreamHandler

sun.net.www.protocol.file.Handler
sun.net.www.protocol.ftp.Handler
sun.net.www.protocol.http.Handler
sun.net.www.protocol.https.Handler
sun.net.www.protocol.jar.Handler
sun.net.www.protocol.mailto.Handler
sun.net.www.protocol.netdoc.Handler

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 使用以下代码: let socket_addr: std::net::SocketAddr = // ...; let win_socket_addr: windows_sys::Win32::Networking::WinSock::SOCKADDR_IN = socket_addr.into(); ### 回答2: 要将std::net::SocketAddr转化为windows_sys::Win32::Networking::WinSock::SOCKADDR_IN,可以使用以下Rust代码: ```rust use std::net::{IpAddr, Ipv4Addr, Ipv6Addr, SocketAddr}; use winapi::um::winsock2::SOCKADDR_IN; use winapi::shared::ws2def::{AF_INET, AF_INET6}; use winapi::shared::in6addr::in6addr_any; fn socket_addr_to_sockaddr_in(socket_addr: &SocketAddr) -> SOCKADDR_IN { let ip_addr = socket_addr.ip(); let port = socket_addr.port(); match ip_addr { IpAddr::V4(ipv4_addr) => { let mut sockaddr_in: SOCKADDR_IN = unsafe { std::mem::zeroed() }; sockaddr_in.sin_family = AF_INET as u16; sockaddr_in.sin_addr.S_un.S_addr = u32::from(ipv4_addr); sockaddr_in.sin_port = port.to_be(); sockaddr_in } IpAddr::V6(ipv6_addr) => { let mut sockaddr_in6: SOCKADDR_IN = unsafe { std::mem::zeroed() }; sockaddr_in6.sin6_family = AF_INET6 as u16; sockaddr_in6.sin6_port = port.to_be(); sockaddr_in6.sin6_addr = *ipv6_addr.segments(); if *ipv6_addr == Ipv6Addr::from(in6addr_any) { sockaddr_in6.sin6_addr = *in6addr_any; } sockaddr_in6 } } } fn main() { let socket_addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 8080); let sockaddr_in = socket_addr_to_sockaddr_in(&socket_addr); // Do something with the converted SOCKADDR_IN println!( "Converted SOCKADDR_IN: {{ family: {}, addr: {}, port: {} }}", sockaddr_in.sin_family, sockaddr_in.sin_addr.S_un.S_addr, sockaddr_in.sin_port ); } ``` 以上代码使用Rust的winapi库来访问Windows Socket API,并将std::net::SocketAddr的IP地址和端口转换为windows_sys::Win32::Networking::WinSock::SOCKADDR_IN结构体。根据输入的std::net::SocketAddr类型,使用IF_INET或IF_INET6来设置SOCKADDR_IN的family字段。然后将IP地址和端口填充到SOCKADDR_IN结构体中。在这个例子中,我们将std::net::SocketAddr转化为127.0.0.1:8080的SOCKADDR_IN。 ### 回答3: 使用Rust编写的代码如下所示: ```rust use std::net::SocketAddr; use windows_sys::Win32::Networking::WinSock::SOCKADDR_IN; fn main() { let socket_addr = SocketAddr::new("127.0.0.1".parse().unwrap(), 8080); let sockaddr_in = SOCKADDR_IN { sin_family: 2, // AF_INET sin_port: socket_addr.port().to_be(), sin_addr: socket_addr.ip().octets().into(), sin_zero: [0; 8], // initialize sin_zero with zeros }; println!("SOCKADDR_IN: {:?}", sockaddr_in); } ``` 以上代码首先导入了`std::net::SocketAddr`和`windows_sys::Win32::Networking::WinSock::SOCKADDR_IN`模块。然后创建了一个`SocketAddr`实例,该实例包含了IP地址和端口号。接下来,我们定义了一个`SOCKADDR_IN`结构体变量,并根据`SocketAddr`的信息进行初始化。最后,打印输出了转换后的`SOCKADDR_IN`实例。 这段代码将`std::net::SocketAddr`转化为了`windows_sys::Win32::Networking::WinSock::SOCKADDR_IN`。在转换过程中,我们将IP地址转化为字节数组,然后将端口号进行了字节序的转换。最后,我们打印输出了转换后的结果,以便验证转换是否成功。 注意:本示例中使用的`sockets` crate中的`windows-sys`模块提供了便于与Windows系统交互的Rust绑定,以简化开发过程。请在使用之前确认已在`Cargo.toml`中添加相应的依赖。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值