计算机网络——Socket实验1

简介: 计算机网络——Socket实验1

一、实验目的


学习网络编程基本概念、InetAddress的应用、URL的应用、URLConnection的应用


二、实验内容


InetAddress类和URLConnection类的使用


三、实验环境


使用Windows操作系统;Internet连接

Eclipse+Java开发环境


四、实验步骤


1 InetAddress类


1.1 InetAddress类的简介


Internet上的主机有两种表示地址的方式:域名和IP地址。有时候需要通过域名来查找它对应的IP地址,有时候又需要通过IP地址来查找主机名。这时候可以利用java.net包中的InetAddress类来完成任务。


InetAddress类是IP地址封装类,同时它也是一个比较奇怪的类,它没有公共的构造方法,只能利用该类的一些静态方法来获取对象实例,然后再通过这些对象实例来对IP地址或主机名进行处理。该类常用的一些静态方法有如下。


public static InetAddress getByName(String hostname):根据给定的主机名创建一个InetAddress对象,可用来查找该主机的IP地址

public static InetAddress getByAddress (byte[] addr):根据给定的IP地址创建一个InetAddress对象,可用来查找该IP对应的主机名

public static getHostAddress():获取IP地址

public static getHostName():获取主机名

此外,该类还有一些其他常用的方法,具体如下:


String getCanonicalHostName():获取此 IP 地址的完全限定域名

String getHostAddress():返回 IP 地址字符串(以文本表现形式)

String getHostName():获取此 IP 地址的主机名

Int hashCode():返回此 IP 地址的哈希码

Boolean isAnyLocalAddress():检查 InetAddress是否是通配符地址的实用例行程序

boolean isLinkLocalAddress():检查 InetAddress是否是链接本地地址的实用例行程序

boolean isLoopbackAddress():检查 InetAddress是否是回送地址的实用例行程序

Boolean isMCGlobal():检查多播地址是否具有全局域的实用例行程序

Boolean isMCLinkLocal():检查多播地址是否具有链接范围的实用例行程序

Boolean isMCNodeLocal():检查多播地址是否具有节点范围的实用例行程序

Boolean isMCOrgLocal():检查多播地址是否具有组织范围的实用例行程序

Boolean isMCSiteLocal():检查多播地址是否具有站点范围的实用例行程序

Boolean isMulticastAddress():检查 InetAddress 是否是 IP 多播地址的实用例行程序

Boolean isReachable(int timeout):测试是否可以达到该地址

Boolean isReachable(NetworkInterface netif, int ttl, int timeout):测试是否可以达到该地址

Boolean isSiteLocalAddress():检查 InetAddress 是否是站点本地地址的实用例行程序

String toString():将此 IP 地址转换为 String


1.2 获取本地机的名称和IP地址


由于我们已经学习了InetAddress类的一些方法,在此,我们可以直接利用getLocalHost方法获取本地主机名和本地地址。


3c8f07f7a6724da6994ccc1635f8fe50.png


图 1 获取本机名与地址的代码


如图 1,第一行引入所需的java.net包。在主函数内,先定义InetAddress类,并调用getLocalHost方法获取对应的地址,最后将结果进行输出即可。


a1d7c1d196db481b991755c284259def.png


图 2 获取本机名与地址的输出


      如图 2,即为输出的结果,我们电脑的主机名为“YunhaoAlienware”,地址为192.168.85.1


1.3 获取CSDN的全部IP地址


由于我们已经学习了InetAddress类的一些方法,在此,我们可以直接利用getAllByName方法,将所有IP地址存入一个列表并进行输出。


1ca9e8438cfd448290c87925864f82f3.png


图 3 获取CSDN的所有IP地址代码


如图 3,第一行引入所需的java.net包。在主函数内,先定义InetAddress类的数组,并调用getAllByName方法获取所有的IP地址并存入数组,最后将结果进行输出即可。


e108dbd64af840d3984445242d50dd1c.png


图 4 获取CSDN的所有IP地址的输出


如图 4,即为输出的结果,CSDN只有一个IP地址,为39.106.226.142。


2 URL类与URLConnection类


2.1 URL类的简介


URL 类代表一个统一资源定位符,它是指向互联网“资源”的指针。资源可以是简单的文件或目录,也可以是对更为复杂的对象的引用,例如对数据库或搜索引擎的查询。通常,URL 可分成几个部分。


https://www1.szu.edu.cn/board/view.asp,该 URL 示例指示使用的协议为 https (超文本传输安全协议)并且该信息驻留在一台名为www1.szu.edu.cn 的主机上。主机上的信息名称为/board/view.asp。主机上此名称的准确含义取决于协议和主机。该信息一般存储在文件中,但可以随时生成。该 URL 的这一部分称为路径部分。


此外,URL 可选择指定一个“端口”,它是用于建立到远程主机 TCP 连接的端口号。如果未指定该端口号,则使用协议默认的端口。例如,http 协议的默认端口为 80。


      URL类有如下6种构造方法:


URL(String spec):根据 String 表示形式创建 URL 对象

URL(String protocol, String host, int port, String file):根据指定 protocol、host、port 号和 file 创建 URL 对象

URL(String protocol, String host, int port, String file, URLStreamHandler handler):根据指定的 protocol、host、port 号、file 和 handler 创建 URL 对象

URL(String protocol, String host, String file):根据指定的 protocol 名称、host 名称和 file 名称创建 URL

URL(URL context, String spec):通过在指定的上下文中对给定的 spec 进行解析创建 URL

URL(URL context, String spec, URLStreamHandler handler):通过在指定的上下文中用指定的处理程序对给定的 spec 进行解析来创建 URL

此外,URL类还有一些其他常用的方法,具体如下:


boolean equals(Object obj):比较此 URL 是否等于另一个对象。

String getAuthority():获取此 URL 的授权部分。

Object getContent():获取此 URL 的内容。

Object getContent(Class[] classes):获取此 URL 的内容。

int getDefaultPort():获取与此 URL 关联协议的默认端口号。

String getFile():获取此 URL 的文件名。

String getHost():获取此 URL 的主机名(如果适用)。

String getPath():获取此 URL 的路径部分。

int getPort():获取此 URL 的端口号。

String getProtocol():获取此 URL 的协议名称。

String getQuery():获取此 URL 的查询部分。

String getRef():获取此 URL 的锚点(也称为“引用”)。

String getUserInfo():获取此 URL 的 userInfo 部分。

int hashCode():创建一个适合哈希表索引的整数。

URLConnection openConnection():返回一个 URLConnection 对象,它表示到 URL 所引用的远程对象的连接。

URLConnection openConnection(Proxy proxy):与 openConnection() 类似,所不同是连接通过指定的代理建立;不支持代理方式的协议处理程序将忽略该代理参数并建立正常的连接。

InputStream openStream():打开到此 URL 的连接并返回一个用于从该连接读入的 InputStream。

boolean sameFile(URL other):比较两个 URL,不包括片段部分。

protected void set(String protocol, String host, int port, String file, String ref):设置 URL 的字段。

protected void set(String protocol, String host, int port, String authority, String userInfo, String path, String query, String ref):设置 URL 的指定的 8 个字段。

static void setURLStreamHandlerFactory(URLStreamHandlerFactory fac):设置应用程序的 URLStreamHandlerFactory。

String toExternalForm():构造此 URL 的字符串表示形式。

String toString():构造此 URL 的字符串表示形式。

URI toURI():返回与此 URL 等效的 URI。


2.2 URLConnection类的简介


URLConnection是一个抽象类,表示指向URL指定资源的活动连接。URL类中的openConnection()方法可生成一个URLConnection对象,URLConnection类的实例可用于读取和写入此URL引用的资源。在网络编程工作中,JAVA的URLConnection是一个常用的类,它提供了一个非常方便的接口,只要提供需要连接的主机的URL地址,使用URL类的openConnection()方法就可以得到一个HttpURLConnection的对象,其中HttpURLConnection类是URLConnection类的子类,然后在此基础上分析HTTP内容,完成相关任务。在这种方式下,使用者不必考虑底层的实现细节,避免了烦琐的Socket类的代码编写,因此比较常用


      URLConnection类常用的构造方法只有一个,即通过URL获取对应的URLConnection类:


protected URLConnection(URL url)

在建立了远程对象后,则会经常使用如下方法来获取对应的值:


getContent: 获取此 URL 连接的内容。

getHeaderField: 返回指定的头字段的值。如果调用的连接多次使用不同的值设置了头字段,则只返回最后一次设置的值。

getInputStream: 返回从此打开的连接读取的输入流。 在读取返回的输入流时,如果在数据可供读取之前达到读入超时时间,则会抛出 SocketTimeoutException。

getOutputStream: 返回写入到此连接的输出流。


2.3使用URL类下载一张图片


URL类经常用于下载网络资源,URL通过构造函数(构造函数为URL地址)可以得到一个对象,该对象的openStream()方法可以得到InputStream对象,得到InputStream就可以把网站上的资源下载下来了。下面是一个实例,使用URL类下载某个网站上的一张图片并保存到本地。


a875767851854bd7a77ed7de2f3b3d40.png


图 5 使用URL下载图片的代码


      如图 5,前两行引入所需的包,第6,7行借助URL类获取输入流,并在第9-13行利用循环将输入流存入本地文件中。


37863166e55e454fb36e9ef9b70e0629.png


图 6 使用URL下载的图片


      如图 6,即为使用URL下载的图片。


2.4使用URL类下载深大首页,并统计下载得到网页文件的大小


由于我们已经学习了URL类的一些方法,在此,我们可以直接利用URL类建立连接,并通过结合URLConnection类的方法,借助流来获取深大首页的文件。


52e6ed484bac43e89fc419cc1b3fa066.png


图 7 URL类下载深大首页代码


      如图 7,首先前三行引入所需的包。第8,9行借助URL类和URLConnection类建立连接,第11行使用getInputStream方法获取对应的输入流,第12行使用文件流创建文件。然后第13-17行利用while循环将内容读入到文件中。最后19-20行借助文件获取对应html文件的大小。


c3fb8b5198b94b728fe56131c3846ada.png


图 8 获取的html文件的大小


e3496edda6304d66918da070301c315f.png


图 9 获取的HTML文件


      如图 9,获取的深大主页的文件如图所示;如图 8,获取的html文件的大小为92.9kb。


附录


代码如下:


import java.io.*;
import java.net.InetAddress;
import java.net.URL;
import java.net.URLConnection;
public class Main {
    public static void main(String[] args) throws IOException {
        //使用InetAddress类的方法获取本地机的名称和IP地址
        InetAddress address = InetAddress.getLocalHost();
        System.out.println("Localhost:" + address);
        //使用InetAddress类的方法获取网站www.csdn.net的IP地址,如果存在多个IP地址,要求全部返回
        InetAddress[] address_Arr = InetAddress.getAllByName("www.csdn.net");
        System.out.println("All the IP address about CSDN:");
        for (InetAddress inetAddress : address_Arr) {
            System.out.println(inetAddress.toString());
        }
        // 使用URL类下载深圳大学首页http://www.szu.edu.cn,并统计下载得到网页文件的大小
        URL url = new URL("https://www.szu.edu.cn");
        URLConnection url_connection = url.openConnection();
        InputStream in = url_connection.getInputStream();
        FileOutputStream fout = new FileOutputStream("szu_index.html");
        int a = 0;
        while (a > -1) {
            a = in.read();
            fout.write(a);
        }
        fout.close();
        File file = new File("szu_index.html");
        System.out.println("File size:" + file.length() / 1024.00 + "k");
    }
}
相关文章
|
3月前
|
开发者 Python
Python Socket编程:不只是基础,更有进阶秘籍,让你的网络应用飞起来!
在数字时代,网络应用成为连接世界的桥梁。Python凭借简洁的语法和丰富的库支持,成为开发高效网络应用的首选。本文通过实时聊天室案例,介绍Python Socket编程的基础与进阶技巧。基础篇涵盖服务器和客户端的建立与数据交换;进阶篇则探讨多线程与异步IO优化方案,助力提升应用性能。通过本案例,你将掌握Socket编程的核心技能,推动网络应用飞得更高、更远。
72 1
|
1月前
|
Kubernetes 网络协议 Python
Python网络编程:从Socket到Web应用
在信息时代,网络编程是软件开发的重要组成部分。Python作为多用途编程语言,提供了从Socket编程到Web应用开发的强大支持。本文将从基础的Socket编程入手,逐步深入到复杂的Web应用开发,涵盖Flask、Django等框架的应用,以及异步Web编程和微服务架构。通过本文,读者将全面了解Python在网络编程领域的应用。
36 1
|
2月前
|
Java
[Java]Socket套接字(网络编程入门)
本文介绍了基于Java Socket实现的一对一和多对多聊天模式。一对一模式通过Server和Client类实现简单的消息收发;多对多模式则通过Server类维护客户端集合,并使用多线程实现实时消息广播。文章旨在帮助读者理解Socket的基本原理和应用。
33 1
|
2月前
|
消息中间件 监控 网络协议
Python中的Socket魔法:如何利用socket模块构建强大的网络通信
本文介绍了Python的`socket`模块,讲解了其基本概念、语法和使用方法。通过简单的TCP服务器和客户端示例,展示了如何创建、绑定、监听、接受连接及发送/接收数据。进一步探讨了多用户聊天室的实现,并介绍了非阻塞IO和多路复用技术以提高并发处理能力。最后,讨论了`socket`模块在现代网络编程中的应用及其与其他通信方式的关系。
264 3
|
2月前
|
网络协议 Linux 应用服务中间件
Socket通信之网络协议基本原理
【10月更文挑战第10天】网络协议定义了机器间通信的标准格式,确保信息准确无损地传输。主要分为两种模型:OSI七层模型与TCP/IP模型。
|
2月前
|
网络协议 网络虚拟化 网络架构
【网络实验】/主机/路由器/交换机/网关/路由协议/RIP+OSPF/DHCP(上)
【网络实验】/主机/路由器/交换机/网关/路由协议/RIP+OSPF/DHCP(上)
83 1
|
3月前
|
网络架构
静态路由 网络实验
本文介绍了如何通过配置静态路由实现不同网络设备间的通信,包括网络拓扑图、设备IP配置、查看路由表信息、配置静态路由和测试步骤。通过在路由器上设置静态路由,使得不同子网内的设备能够互相通信。
静态路由 网络实验
|
3月前
|
网络虚拟化
网络实验 VlAN 中 Trunk Access端口的说明及实验
本文介绍了VLAN技术及其在网络实验中的应用,包括Access端口和Trunk端口的工作原理,以及如何通过实验划分不同VLAN实现内部通信和跨交换机实现VLAN间通信的详细步骤和配置。
网络实验 VlAN 中 Trunk Access端口的说明及实验
|
3月前
|
网络协议 Python
网络世界的建筑师:Python Socket编程基础与进阶,构建你的网络帝国!
在数字宇宙中,网络如同复杂脉络连接每个角落,Python Socket编程则是开启这一世界的钥匙。本文将引导你从基础概念入手,逐步掌握Socket编程,并通过实战示例构建TCP/UDP服务器与客户端。你将学会使用Python的socket模块进行网络通信,了解TCP与UDP的区别,并运用多线程与异步IO提升服务器性能。跟随本文指引,成为网络世界的建筑师,构建自己的网络帝国。
40 2
|
3月前
|
网络协议 Python
告别网络编程迷雾!Python Socket编程基础与实战,让你秒变网络达人!
在网络编程的世界里,Socket编程是连接数据与服务的关键桥梁。对于初学者,这往往是最棘手的部分。本文将用Python带你轻松入门Socket编程,从创建TCP服务器与客户端的基础搭建,到处理并发连接的实战技巧,逐步揭开网络编程的神秘面纱。通过具体的代码示例,我们将掌握Socket的基本概念与操作,让你成为网络编程的高手。无论是简单的数据传输还是复杂的并发处理,Python都能助你一臂之力。希望这篇文章成为你网络编程旅程的良好开端。
65 3