网络

1.网络编程概述
计算机网络,是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在操作系统、网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统。这个网络中包含的设备有:计算机、路由器、交换机等等

网络编程的实质就是已经建立好的计算机网络的基础之上,通过使用程序控制的特定方式,让两个(或多个)设备(例如计算机)之间进行数据传输

java中的网络编程并不要求我们之前对计算机网络的知识有那么深入的研究,只需对网络的概念有基本的认识,并了解IP地址、端口号、URL等内容,这样就能够学习并使用JDK中提供的网络编程的API

java中和网络编写相关的API都在java.net包下面

2.OSI七层模型和TCP/IP四层模型
开放系统互连参考模型 (Open System Interconnect 简称OSI)是国际标准化组织(ISO)和国际电报电话咨询委员会(CCITT)联合制定的开放系统互连参考模型,为开放式互连信息系统提供了一种功能结构的框架。它从低到高共七层分别是:物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。

ISO制定的OSI参考模型的过于庞大和复杂。为此,由技术人员自己开发的TCP/IP协议栈获得了更为广泛的应用。

TCP/IP协议栈是美国国防部高级研究计划局计算机网(Advanced Research Projects Agency Network,ARPANET)和其后继因特网使用的参考模型。ARPANET是由美国国防部(U.S.Department of Defense,DoD)赞助的研究网络。最初,它只连接了美国境内的四所大学。随后的几年中,它通过租用的电话线连接了数百所大学和政府部门。最终ARPANET发展成为全球规模最大的互连网络(也就是现在的因特网)。最初的ARPANET于1990年永久性地关闭。 

TCP/IP参考模型分为四层:应用层、传输层、网络层和网络接口层.

注:TCP/IP参考模型也可以分为五层,就是再把网络接口层分为数据链路层和物理层。

3.TCP和UDP协议
1)TCP(transmission control protocol),传输控制协议
TCP协议是一个面向连接的、可靠的协议。它将一台主机发出的字节流无差错地发往互联网上的其他主机。在发送端,它负责把上层传送下来的字节流分成报文段并传递给下层。在接收端,它负责把收到的报文进行重组后递交给上层。TCP协议还要处理端到端的流量控制,以避免缓慢接收的接收方没有足够的缓冲区接收发送方发送的大量数据。

	特点:传输效率低,可靠性强,用于传输可靠性要求高,数据量大的数据.例如:文件传输

2)UDP(user datagram protocol),用户数据报协议
	UDP协议是一个不可靠的、无连接协议,主要适用于不需要对报文进行排序和流量控制的场合。
	
	特点:与TCP特性恰恰相反,用于传输可靠性要求不高的数据.例如:视频聊天

4.HTTP和TPC/IP以及DNS
TPC/IP协议是传输层协议,主要解决数据如何在网络中传输,而HTTP是应用层协议,主要解决如何包装数据。所以,HTTP协议是建立在TCP/IP之上的一个协议。

DNS(Domain names System)是处于应用层的"服务",提供域名到IP地址之间的解析服务。可以让我们访问网络中的一台主机的时候不需要使用IP地址而是使用便于我们记忆的域名。
互联网之间是通过IP地址通信的,但是IP地址并不符合认得记忆习惯,人喜欢记忆有意义的字词。所以DNS服务就为了解决这个问题的,可以让我们使用域名来访问网络中的一台主机。

5.软件架构:C/S和B/S
C/S和B/S,是两种软件架构方式,都可以进行同样的业务处理,甚至也可以用相同的方式实现共同的逻辑。

C/S架构的全称是Client/Server,即客户端服务器端架构,客户端包含一个或多个在用户的电脑上运行的程序,而服务器端可以使用Socket来实现,服务器端的程序通过Socket与客户端的程序通信。

C/S 架构也可以看做是胖客户端架构,因为客户端需要实现很多的业务逻辑和界面展示功能。这种架构中,作为客户端的部分需要承受很大的压力,因为显示逻辑和事务处理都包含在其中。
优点:
	C/S架构的界面和操作可以很丰富。
	安全性能可以很容易保证。
	响应速度较快。

缺点:
	适用面窄,通常用于局域网中。
	用户群固定,由于程序需要安装才可使用,因此不适合面向一些不可知的用户。
	维护成本高,软件进行一次升级,则所有客户端的程序都需要改变。



B/S架构的全称为Browser/Server,即浏览器/服务器结构。Browser指的是Web浏览器,极少数业务逻辑在前端实现,主要业务功能都在服务器端实现。B/S架构的系统无须特别安装,只有Web浏览器即可。(通常是要基于HTTP协议进行信息交互)

B/S架构中,显示逻辑交给了Web浏览器,业务逻辑处理在放在了服务器端,这样就避免了庞大的胖客户端,减少了客户端的压力。因为客户端包含的逻辑很少,因此也被成为瘦客户端。

优点:
	客户端无需安装,有Web浏览器即可。
	B/S架构可以直接放在广域网上,通过一定的权限控制实现多客户访问的目的,交互性较强。
	B/S架构无需升级多个客户端,升级服务器即可。

缺点:
	在跨浏览器上,B/S架构不尽如人意。
	显示效果要达到C/S程序的程度需要花费不少精力。
	在速度和安全性上需要花费巨大的设计成本。
	客户端服务器端的交互一般是请求-响应模式,通常需要刷新页面

6.java中基于TCP协议的网络编程
java.net.Socket类
socket也称为套接字,可以用来表示两台机器间通信的端点,可以用socket对客户端进行实现

java.net.ServerSocket类
	ServerSocket可以实现服务器端套接字。

注:java的网络编程也可以称为套接字编程或者socket编程

7.java中基于UDP协议的网络编程
java.net.DatagramSocket类
UDP协议编程中的套接字,可以用来实现客户端也可以实现服务器端
java.net.DatagramPacket类
此类表示UDP协议通信中所传输的数据报包

注:无论客户端还是服务器都会使用这个俩个类

例如:
public class UDPServerTest {
	private DatagramSocket socket;
	private DatagramPacket packet;
	private byte[] buf;
	
	public UDPServerTest(int port) {
		try {
			socket = new DatagramSocket(port);
			buf = new byte[512];
			packet = new DatagramPacket(buf, buf.length);
		} catch (SocketException e) {
			e.printStackTrace();
		}
	}
	
	public void start(){
		try {
			//使用packet接收数据
			socket.receive(packet);
			//也可以使用字节流从buf中读出数据
			System.out.println("服务器接收的数据为:"+new String(buf,0,packet.getLength()));
		} catch (IOException e) {
			e.printStackTrace();
		}finally {
			if(socket!=null)socket.close();
		}
	}
	public static void main(String[] args) {
		UDPServerTest t = new UDPServerTest(9999);
		t.start();
	}
}	



public class UDPClientTest {
	private DatagramSocket socket;
	private DatagramPacket packet;
	
	public UDPClientTest() {
		try {
			socket = new DatagramSocket();
		} catch (SocketException e) {
			e.printStackTrace();
		}
	}
	
	public void send(String ip,int port){
		try {
			byte[] buf = "hello world 中国".getBytes();
			//打好数据报包,并指定要发生到的ip和端口
			packet = new DatagramPacket(buf, buf.length,InetAddress.getByName(ip), port);
			//发送数据
			socket.send(packet);
			System.out.println("客户端发送数据完毕");
		} catch (IOException e) {
			e.printStackTrace();
		}finally {
			if(socket!=null)socket.close();
		}
	}
	
	public static void main(String[] args) {
		UDPClientTest t = new UDPClientTest();
		String ip = "127.0.0.1";
		int port = 9999;
		t.send(ip, port);
	}
}	

8.URI和URL
URI是uniform resource identifier,统一资源标识符,用来唯一的标识一个资源。
URL是uniform resource locator,统一资源定位器,它是一种具体的URI,即URL可以用来标识一个资源,而且还指明了如何locate这个资源。

URI是以一种抽象的,高层次概念定义统一资源标识,而URL则是具体的一种资源标识的方式。

在Java的URI中,一个URI实例可以代表绝对的,也可以是相对的,只要它符合URI的语法规则。而URL类则不仅符合语义,还包含了定位该资源的信息,因此它不能是相对的,schema(访问协议)必须被指定。

统一资源标志符URI就是在某一规则下能把一个资源独一无二地标识出来。拿人做例子,假设这个世界上所有人的名字都不能重复,那么名字就是URI的一个实例,通过名字这个字符串就可以标识出唯一的一个人。现实当中名字当然是会重复的,所以身份证号才是URI,通过身份证号能让我们能且仅能确定一个人。
那统一资源定位符URL是什么呢。也拿人做例子然后跟HTTP的URL做类比,就可以有:动物住址协议://地球/中国/山西省/太原市/小店区/某大学/14号宿舍楼/525号寝/张三.人可以看到,这个字符串同样标识出了唯一的一个人,起到了URI的作用,所以URL是URI的子集。URL是以描述人的位置来唯一确定一个人的。在上文我们用身份证号也可以唯一确定一个人。对于这个在太原的张三,我们也可以用:身份证号:123456789来标识他。所以不论是用定位的方式还是用编号的方式,我们都可以唯一确定一个人,都是URl的一种实现,而URL就是用定位的方式实现的URI。

//是URI也是URL
ftp://ftp.is.co.za/rfc/rfc1808.txt 
http://www.ietf.org/rfc/rfc2396.txt 
mailto:John.Doe@example.com 
telnet://192.0.2.16:80/ 

//只是URI
tel:+1-816-555-1212
urn:oasis:names:specification:docbook:dtd:xml:4.1.2
/user/1


例如:
public static void main(String[] args) {
try {
URL url = new URL(“https://www.baidu.com/?name=tom#N1”);

		// 获取与此 URL关联协议的默认端口号
		System.out.println("Default port = " + url.getDefaultPort());
		// 获取此 URL的主机名
		System.out.println("Host = " + url.getHost());
		// 获取此 URL 的路径部分
		System.out.println("Path = " + url.getPath());
		// 获取此 URL 的端口号,如果未设置端口号,则返回 -1
		System.out.println("Port = " + url.getPort());
		// 获取此 URL 的协议名称
		System.out.println("Protocol = " + url.getProtocol());
		// 获取此 URL 的查询部分
		System.out.println("Query = " + url.getQuery());
		// 获取此 URL的锚点
		System.out.println("Ref = " + url.getRef());

		// -------模拟浏览器向此URL发生请求----------------

		HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();
		httpConn.setRequestMethod("GET");
		httpConn.setRequestProperty("User-Agent",
				"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:75.0) Gecko/20100101 Firefox/75.0");
		InputStream is = httpConn.getInputStream();
		Reader in = new InputStreamReader(is);
		char[] cbuf = new char[1024];
		int len = -1;
		while ((len = in.read(cbuf)) != -1) {
			System.out.print(new String(cbuf, 0, len));
		}
	} catch (IOException e) {
		e.printStackTrace();
	} finally {
		// close
	}
}

输出结果:
Default port = 443
Host = www.baidu.com
Path = /
Port = -1
Protocol = https
Query = name=tom
Ref = N1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值