• Java网络编程


           计算机网络是通过传输介质、通信设施和网络通信协议,把分散在不同地点的计算机设备互连起来的,实现资源共享和数据传输的系统。网络编程就是编写程序使互联网的两个或多个设备(如计算机)之间 进行数据传输。 Java 语言对网络编程提供了良好的支持。通过其提供的接口我们可以很方便地进行网络 编程。

    IP地址相关操作

    ---InetAddress Java IP 地址的封装。其下有两个子类 Inet4Address Inet6Address 。这个类的实例经常和 UDP DatagramSockets Socket ServerSocket 类一起使用
    ---InetAddress 没有公开的构造方法,因此你必须通过一系列静态方法中的某一个来获取它的实例。
    1. //www.baidu.com实际上是主机名称
    2. //IPv4采用的是点分十进制的记法,所以难以记忆,
    3. //引入DNS可以将一个有含义的字符串和一个IP地址建立对应关系,当使用有含义的字符串时可以通过DNS转换为IP地址
    4. //InetAddress对象中可以封装一个IP地址和一个主机名
    5. InetAddress ia ==InetAddress.getByName("www.baidu.com"); //获取对应主机名称的IP地 址,会自动调用DNS服务
    6. System.out.println(ia);
    7. System.out.println();
    8. InetAddress[] arr=InetAddress.getAllByName("www.baidu.com"); //获取对应主机 名称的所有注册IP地址
    9. for(InetAddress tmp:arr)
    10. System.out.println(tmp);
    11. System.out.println();
    12. // new InetAddress() 没有提供可以直接使用的构造器,所以不能直接new创建对象
    13. ia=InetAddress.getLocalHost();//获取本地机的IP地址
    14. System.out.println(ia); //lover/172.30.1.101
    15. ia=InetAddress.getLoopbackAddress(); //获取回绕地址
    16. System.out.println(ia); //localhost/127.0.0.1
    17. System.out.println(ia.getClass()); //class java.net.Inet4Address
    18. System.out.println();
    19. //通过IP地址查询对应信息
    20. InetAddress ia1=InetAddress.getByName("14.215.177.39");
    21. System.out.println(ia1);
    22. //用于判断是否可以连接ia对象对应的主机,可以理解为尝试是否能够ping通
    23. System.out.println(ia1.isReachable(2000));

    URL访问网上资源

           URL 对象代表统一资源定位器,是指向互联网资源的指针,资源可以是简单的文件或目录,也可以是对复杂对象的引用,例如对数据库或搜索引擎的查询。用协议名、主机、端口和资源组成,即满足格式: protocol://host:port/resourceName ,例如 http://www.yan.com:80/index.php
    http 协议的标准端口为 80 https=http+SSL 加密数据传输的 http ,标准端口为 443
    • URL统一资源指针,可以指定一个具体的资源,例如一个html网页
    • URI统一资源标识符,可以认为为了方便记忆,给URL起的别名
    构建 URL 对象
    // 创建一个 URL 对象,用于指代网络中的一个资源,如果网址不合法,则抛出 MalformedURLException
    URL url = new
    URL(" https://news.cctv.com/2022/09/12/ARTIZ8cD6tXepRSQ5cFIHyA5220912.shtml ");
    最重要的方法:
    • url.openConnection()URLConnection 可以获取输入、输出流
    • url.openStream()InputStream 直接获取输入流
    不重要的方法 :
    通过 URL 对象的一些方法可以访问该 URL 对应的资源:
    • String getFile():获取该URL的资源名
    • String getHost():获取主机名
    • String getPath():获取路径部分
    • int getPort():获取端口号

    URLURLConnection比较

    URL URLConnection 的区别在于前者代表一个资源的位置 , 后者代表一种连接
    Java 语言提供了两种方法读取数据,一种是通过 URL 对象直接得到相关的网络信息 InputStream is =url.openStream() ; ,另一种是先得到一个 URLConnection 实例,再得到 InputStream InputStream 对象,然后读取数据
    1. URLConnection conn = url.openConnection();
    2. InputStream is1 = conn.getInputStream();
    3. OutputStream os1 = conn.getOutputStream();
    前者是一种简单、直接的方法,但缺乏灵活性,并且只能读取只读信息,后者提供了更加灵活有效的方 法来读取网络资源

    TCP编程

    在实际应用中 TCP 网络程序提供可靠的数据通信,而 UDP 网络程序则不保证数据的可靠性,但是协议简单、传输速度快(比如用在音视频数据传输,它们不需要很高的可靠性,偶尔丢帧是可以忍受的)
    • TCPTranfer Control Protocol的 简称,是一种面向连接的端对端的保证可靠传输的协议。
    • 通过TCP协议传输,得到的是一个顺序的无差错的数据流。
    发送方和接收方的成对的两个 socket 之间必须建立连接,以便在 TCP 协议的基础上进行通信,当一个socket (通常都是 server socket )等待建立连接时,另一个 socket 可以要求进行连接,一旦这两个 socket 连接起来,它们就可以进行双向数据传输,双方都可以进行发送 或接收操作。

    Socket概述

           Socket 套接字,就是两台主机之间逻辑连接的端点。 TPC 协议是传输层协议,主要解决数据如何在网络中传输,而 HTTP 是应用层协议,主要解决如何包装数据。 Socket 本质上就是一组接口,是对 TCP/IP 协议 的封装和应用 ( 程序员层面上 )
           Socket 编程主要涉及到客户端和服务器端两个方面,首先是在服务器端创建一个服务器套接字
    ServerSocket ,并把它附加到一个端口上,服务器从这个端口监听连接。端口号的范围是 0 65536 ,但是 0 1024 是为特权服务保留的端口号,我们可以选择任意一个当前没有被其他进程使用的端口。
           客户端请求与服务器进行连接的时候,根据服务器的域名或者 IP 地址,加上端口号,打开一个套接字。当服务器接受连接后,服务器和客户端之间的通信就像输入输出流一样进行操作。

    Socket整体流程

          Socket 编程主要涉及到客户端和服务端两个方面,首先是在服务器端创建一个服务器套接字
    ServerSocket ,并把它附加到一个端口上,服务器从这个端口监听连接。端口号的范围是 0 65536 ,但是 0 1024 是为特权服务保留的端口号,我们可以选择任意一个当前没有被其他进程使用的端口。
           客户端请求与服务器进行连接的时候,根据服务器的域名或者 IP 地址,加上端口号,打开一个套接字。 当服务器接受连接后,服务器和客户端之间的通信就像输入输出流一样进行操作。

    ServerSocket

    Java.net 包中的 ServerSocket 类用于表示服务器套接字,其主要功能是监听客户端的请求,然后将客户端的请求连接存入队列中,默认请求队列大小是 50
    构造方法主要有以下几种形式:
    • ServerSocket():创建非绑定服务器套接字。
    • ServerSocket(int port):创建绑定到特定端口的服务器套接字。Port的取值范围为0-65535之间,0表示使用任意未占用端口,建议使用的端口号大于1024。如果端口已经被占用则会 BindException
    • ServerSocket(int port,int backlog):利用指定的backlog创建服务器套接字并将其绑定到指定的本地端口号。
    • ServerSocket(int port,int backlog,InetAdress bindAddress):使用指定的端口、监听backlog和要绑定到本地IP地址创建服务器,适用于计算机有多个网卡、多个IP的情景
    端口扫描
    1. //利用的是ServerSocket在创建时,如果端口已经被占用,则报异常
    2. for (int i = 0; i <= 65535; i++) {//端口号0表示使用自由端口,实际上是不能建立连接的
    3. try {
    4. ServerSocket ss = new ServerSocket(i);
    5. ss.close();//finally
    6. } catch (Exception e) {
    7. System.out.println("端口" + i + "已经被占用");
    8. }
    9. }
    cmd 命令查看端口使用情况 netstat - an
    • LISTENING是指开放着的,等待连接的
    • ESTABLISHED是正在连接
    • CLOSE_WAITTIME_WAITSYN_SENT是三次握手四次挥手过程中的某些状态
    开放端口包括三种:
    • 0.0.0.0:端口号
    • 127.0.0.1:端口号
    • 主机ip:端口号
    区别是 0.0.0.0 和主机 ip 后面跟的端口号是对外部网络开放的,是可以通过服务域名、 ip 可以访问的端口,而 127.0.0.1 的端口则是只供本机访问的端口。

    客户端Socket的构造器

    Socket(InetAddress address, int port); 创建远程连接到指定服务器
    Socket(String host, int prot); 在客户端构建 Socket 对象,如果构建成功则获取对象,否则
    ConnectException 。参数 1 为链接主机的名称,也可以使用 InetAddress 表示 IP 地址;参数 2 为链接服务器的监听端口号,要求服务器已经打开的链接端口
    Socket(String host, int port, InetAddress localAddr, int localPort)
    Socket(InetAddressaddress, int port, InetAddress localAddr, int localPort)
  • 相关阅读:
    25.0 MySQL 数据库概述
    Elasticsearch:检索增强生成 (Retrieval Augmented Generation -RAG)
    移动端页面秒开优化总结
    AD PCB导出Gerber文件(非常详细的步骤)
    前端 | (十四)canvas基本用法 | 尚硅谷前端HTML5教程(html5入门经典)
    Mac 睡眠唤醒 不睡眠 问题
    CDH大数据平台 29Cloudera Manager Console之superset之MySQL元数据配置(markdown新版三)
    P2E-Higtstreet
    月入3w的大二学生告诉你:副业真的没有那么难搞
    15:00面试,15:06就出来了,问的问题有点变态。。。
  • 原文地址:https://blog.csdn.net/m0_59749255/article/details/126858699