菜鸟学习笔记:Java提升篇9(网络1——网络基础、Java网络编程)

23 篇文章 0 订阅
23 篇文章 1 订阅

菜鸟学习笔记:Java提升篇9(网络1——网络基础、Java网络编程)

网络基础

什么是计算机网络

把分布在不同地理区域的计算机与专门的外部设备用通信线路互联成一个规模大、功能强的网络系统,从而使众多计算机可以方便地相互传递信息,共享硬件、软件、数据信息等资源。
概括来说就是将不同区域的计算机连接到一起。它分为局域网、城域网、互联网
计算机网络的功能
资源共享
信息传输与集中处理
均衡负荷与分布处理
综合信息服务
什么是网络通信协议
计算机网络中实现通信必须有一些约定即通信协议,对速率、传输代码、传输控制步骤、出错控制等制定标准。
网络通信接口
为了使两个节点之间能进行对话,必须在它们之间建立通讯工具(即接口),使彼此之间能进行信息交换。接口包括两部分:
硬件装置:实现节点之间的信息传送
软件装置:规定双方进行通信的约定协议
对于开发人员来说我们对网络需要了解两个东西:
IP地址:在一个网段上唯一确定一台计算机的地址。
端口号:两位字节,共65535位,代表65535个端口,类似计算机的门牌号,不同的应用程序可以占用不同的端口,所以可以在网络中通过端口号访问计算机的不同应用程序。

OS七层模型

在网络协议当中,我们一般会去讲解整个网络信息传输的整个过程的时候,都会采用七层模型,它的解释如下:
应用层 文件传输,电子邮件,文件服务,虚拟终端 TFTP,HTTP,SNMP,FTP,SMTP,DNS,Telnet
表示层 数据格式化,代码转换,数据加密 没有协议
会话层 解除或建立与别的接点的联系 没有协议
传输层 提供端对端的接口 TCP,UDP
网络层 为数据包选择路由 IP,ICMP,RIP,OSPF,BGP,IGMP
数据链路层 传输有地址的帧以及错误检测功能 SLIP,CSLIP,PPP,ARP,RARP,MTU
物理层 以二进制数据形式在物理媒体上传输数据 ISO2110,IEEE802,IEEE802.2
网络七层模型
七层模型中同层之间可以通信,上一层可以调用下一层,而与在下一层不发生关系。
一般情况下我们又把应用层、表示层和会话层统称为应用层,这也就是经常说的五层模型。
对于Java开发人员来说主要需要了解的是传输层之上的网络,主要涉及的协议有http、ftp、SMTP、POP3、IMAP4、TCP、UDP等。
对于网络的其他知识大家可以参考计算机网络这本教材,这里篇幅有限就不再细说了。

Java网络编程

注意网络编成和网页编成的概念不同,网页编程主要是用Java来处理http协议发送来的信息(也就是前端返回的消息),主要是像servlet、jsp等后端技术,而网络编成主要涉及通过Java来在几台电脑之间建立连接,从而可以进行数据的传输,这里主要涉及TCP和UDP协议,的内容,我们简单的作个了解。
TCP协议
该协议位于传输层, 提供可靠的字节流服务。概括来说,要通过这个协议进行通信,需要在预先建立连接,就像打电话一样拨通电话,然后开始传送数据,在传输完成后断开连接。它的特点是传送的数据可靠,传送过程中接收者会向发送者确认,如果发送者未接到确认会重新传送,直到最后一帧数据被确认。
UDP协议
无连接协议,也称透明协议,也位于传输层。它和UDP协议不同,传输过程中不需要建立连接,也不提供像TCP那样的可靠传输服务。它只是把应用程序传给IP层的数据报发送出去,但是并不能保证它们能到达目的地。因此报文可能会丢失、重复以及乱序等。所以它的传输速度要快于TCP协议。

InetAddress InetSocketAddress

InetAddress的主要作用是封装计算机的ip地址和DNS,不涉及端口。
该类的运用如下:

	public static void main(String[] args) throws UnknownHostException{		
		//使用getLocalHost方法创建InetAddress对象
		InetAddress addr = InetAddress.getLocalHost();
		System.out.println(addr.getHostAddress());  //返回:192.168.31.238
		System.out.println(addr.getHostName());  //输出计算机名
		//根据域名得到InetAddress对象
		addr = InetAddress.getByName("www.163.com"); 
		System.out.println(addr.getHostAddress());  //返回 163服务器的ip:61.135.253.15
		System.out.println(addr.getHostName());  //输出:www.163.com	
		//根据ip得到InetAddress对象
		addr = InetAddress.getByName("61.135.253.15"); 
		System.out.println(addr.getHostAddress());  //返回 163服务器的ip:61.135.253.15
		System.out.println(addr.getHostName());  //输出ip而不是域名。如果这个IP地 址不存在或DNS服务器不允许进行IP地址和域名的映射,getHostName方法就直接返回这个IP地址。
	}

程序结果:
InetAddress

InetSocketAddress在InetAddress的基础上包含了端口。案例如下:

	public static void main(String[] args) throws UnknownHostException {
		InetSocketAddress  address = new InetSocketAddress("127.0.0.1",9999);
		address = new InetSocketAddress(InetAddress.getByName("127.0.0.1"),9999);
		System.out.println(address.getHostName());
		System.out.println(address.getPort());
		InetAddress addr =address.getAddress();
		System.out.println(addr.getHostAddress());  //返回:地址
		System.out.println(addr.getHostName());  //输出计算机名
		
	}

程序结果:
InetSocketAddress

URL类

首先介绍两个概念:
URI(Uniform resource identifier)它表示统一资源标识符,用来唯一标识一个资源。
URL(Uniform resource locator)是URI的一种实现,它是万维网的统一资源定位标志,就是指网络地址。
通常URL由四部分组成,比如下面的地址:

https://i.csdn.net/#/uc/profile?spm=1001.2100.3001.5111
  • https://表示协议名,也可以是ftp://等。
  • i.csdn.net表示域名,在访问时通过DNS服务器解析为IP地址。
  • 在域名后面:80表示端口号,上面地址完整写法应该为https://i.csdn.net:80/#/uc/profile?spm=1001.2100.3001.5111,一般情况下如果不加端口号默认为80端口.
  • /后面的部分在过去表示资源文件名,一般为index.html或者index.jsp,当然由于现今前端框架的发展,网页不再通过地址来直接访问后端资源,而是在前端通过地址动态的切换组件显示。
  • 有些网站可能还会存在锚点:比如https://blog.csdn.net/qq_41965041/article/details/111500708#_152,这里#_152就是锚点,写网页时可以在长网页的指定位置加入锚点,在访问时可以通过链接后加上锚点进行快速定位快速定位,比方说我们博客中点击目录项,这就是锚点的思想。
  • 当然还有"?"之后的spm=1001.2100.3001.5111部分为访问时传递的参数(get方式)。
    类似file类,URL类可以作为一个URL网址的引用,我们可以通过这个类来对URL进行操作。
	public static void main(String[] args) throws MalformedURLException {
		//绝对路径构建
		URL url = new URL("http://www.baidu.com:80/index.html?uname=aaa");
		System.out.println("协议:"+url.getProtocol());
		System.out.println("域名:"+url.getHost());
		System.out.println("端口:"+url.getPort());
		System.out.println("资源:"+url.getFile());
		System.out.println("相对路径:"+url.getPath());
		System.out.println("锚点:"+url.getRef()); //锚点
		System.out.println("参数:"+url.getQuery());//?参数 :存在锚点  返回null ,不存在,返回正确
		
		url = new URL("http://www.baidu.com:80/a/");
		url = new URL(url,"b.txt"); //相对路径
		System.out.println(url.toString());
		
	}

程序结果:
URL
同样我们也可以像IO流那样通过URL获取网络资源,需要采用url.openStream()方法:

	public static void main(String[] args) throws IOException {
		URL url = new URL("http://www.baidu.com"); //主页 默认资源
		
		//获取资源 网络流
		/*
		InputStream is =url.openStream(); 
		byte[] flush = new byte[1024];
		int len =0;
		while(-1!=(len=is.read(flush))){
			System.out.println(new String(flush,0,len));
		}
		is.close();
		*/
		
		BufferedReader  br = 
				new BufferedReader(new InputStreamReader(url.openStream(),"utf-8"));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("baidu2.html"),"utf-8"));
		
		String msg =null;
		while((msg=br.readLine())!=null){
			//System.out.println(msg);
			bw.append(msg);
			bw.newLine();
		}
		bw.flush();
		bw.close();
		br.close();
	}

写出html
html内容
获取网页源代码也是爬虫的第一步,如果大家对爬虫感兴趣那么在获取网页源代码之后就可以通过字符串操作来获取我们想要的内容了。
上一篇:菜鸟学习笔记:Java提升篇8(线程2——线程的基本信息、线程安全、死锁、生产者消费者模式、任务调度)
下一篇:菜鸟学习笔记:Java提升篇10(网络2——UDP编程、TCPSocket通信、聊天室案例)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值