java基础总结四--让大学生活不再迷茫

承接我的上篇博客
java基础总结一
https://blog.csdn.net/weixin_43410352/article/details/87073372
java基础总结二
https://blog.csdn.net/weixin_43410352/article/details/87201024
java基础总结三
https://blog.csdn.net/weixin_43410352/article/details/87347385

16.网络编程
概述:

通过计算机网络可以使多台计算机实现连接,位于同一个网络中的计算机在进行连接和通信时需要遵守一定的规则。 就好比人要遵守法律,计算机之间的通信也要遵守一定的规则。计算机之间的连接和通信的规则称为网络通信协议。它对数据的传输格式、传输速率、传输步骤等做了统一规定,通信双方必须同时遵守才能完成数据交换。

网络通信协议有很多种,目前应用最广泛的是TCP/IP协议
在进行数据传输时,要求发送的数据与收到的数据完全一样,这时,就需要在原有的数据上添加很多信息,以保证数据在传输过程中数据格式完全一致。TCP/IP协议的层次结构比较简单,共分为四层,如图所示。

在这里插入图片描述

链路层:链路层是用于定义物理传输通道,通常是对某些网络连接设备的驱动协议,例如针对光纤、网线提供的驱动。
网络层:网络层是整个TCP/IP协议的核心,它主要用于将传输的数据进行分组,将分组数据发送到目标计算机或者网络。
传输层:主要使网络程序进行通信,在进行网络通信时,可以采用TCP协议,也可以采用UDP协议。
应用层:主要负责应用程序的协议,例如HTTP协议、FTP协议等。

IP地址和端口号
IP地址:被用来给Internet上的电脑一个编号,ip地址就是网络上识别你电脑的身份标识。就像手机和手机号一样。
端口号:我们知道,一台拥有IP地址的主机可以提供许多服务,比如Web服务、FTP服务、SMTP服务等,这些服务完全可以通过1个IP地址来实现。那么,主机是怎样区分不同的网络服务呢?显然不能只靠IP地址,因为IP 地址与网络服务的关系是一对多的关系。实际上是通过“IP地址+端口号”来区 分不同的服务的。

比如咱们部署tomcat,访问的地址是 localhost:8080/…
localhost(域名)代表本机地址,8080默认Tomcat端口号,此地址不需要联网就能访问,常常用来本机调试.
也可以通过127.0.0.1:8080访问

localhost相比127.0.0.1,localhost具有更多的意义。一个域名是可以绑定多个ip。localhost是个域名,而不是一个ip地址。之所以我们经常把localhost与127.0.0.1认为是同一个是因为我们使用的大多数电脑上都讲localhost指向了127.0.0.1这个地址。

一个域名可以对应多个ip吗?如果一个域名可以对应多个IP,那么实际访问这个域名又会访问到哪个IP?
理论上,一个域名是可以对应多个IP的,而在用户访问过程中,指向某一个具体IP,并不会同时访问多个IP。但不同用户在不同地点访问同一个域名,可能会访问到不同的IP地址,但表象仍旧是这个域名。
例如成都用户访问西部数码官网(www.west.cn),同一时刻,杭州用户也在访问西部数码,那么两人虽然都是访问的同一个域名,但访问的对应IP地址却可能是不同的,根据西部数码负载均衡EasySLB服务功能,服务器将根据各地的访问IP,到达域名IP中路由跳数最小的那个IP地址作为访问的域名IP地址。这样能保证一个域名被访问时,能最大限度提供高速稳定的访问体验。同时,由于有多个备选IP,当其中一个出现问题时,可以实现故障自动切换,提高业务可用性,并提高资源利用率。

InetAddress 类
InetAdress不能被实例化 构造方法是私有的

        InetAddress addr = InetAddress.getByName("www.baidu.com");
		System.out.println("ip地址:"+addr.getHostAddress());
		System.out.println("主机名:"+addr.getHostName());
		
        结果:ip地址:180.97.33.107
        主机名:www.baidu.com

UDP协议:
UDP是无连接通信协议,简单来说,当一台计算机向另外一台计算机发送数据时,发送端不会确认接收端是否存在,就会发出数据,同样接收端在收到数据时,也不会向发送端反馈是否收到数据。

由于使用UDP协议消耗资源小,通信效率高,所以通常都会用于音频、视频和普通数据的传输例如视频会议都使用UDP协议,因为这种情况即使偶尔丢失一两个数据包,也不会对接收结果产生太大影响。

但是在使用UDP协议传送数据时,由于UDP的面向无连接性,不能保证数据的完整性,因此在传输重要数据时不建议使用UDP协议

DatagramPacket和DatagramSocket
要想实现通信DatagramPacket是不够的
DatagramPacket数据包的作用就如同是“集装箱”,可以将发送端或者接收端的数据封装起来。然而运输货物只有“集装箱”是不够的,还需要有码头。DatagramSocket就是这个码头。在程序中需要实现通信只有DatagramPacket数据包是不不行。

在这里插入图片描述

UDP协议例子:

/*
服务端接受数据 属于UDP协议
 */
public class MyServer {
	
	public static void main(String[] args) throws IOException {
		
		// 1.创建服务端 需要端口号
		DatagramSocket server=new DatagramSocket(6666);
		// 2.准备接受容器
		byte[] container=new byte[1024];
		// 3.准备好一个箱子,接受数据
		DatagramPacket packet=new DatagramPacket(container, container.length);
		server.receive(packet);

		InetAddress inetAddress=packet.getAddress();
		byte[] data=packet.getData();
		int len=packet.getLength();
		System.out.println(new String(data,0,len));
		System.out.println(inetAddress.getHostAddress()); //获取客户端的地址
		
		// 4.释放资源
		server.close();
		
		
	}

}

/*
 * 客户端属于UDP协议
 */
public class MyClient {
	public static void main(String[] args) throws IOException {
		
		// 1.创建客户端
		DatagramSocket client=new DatagramSocket(8888);
		// 2.准备数据
		String msg="我的第一次";
		byte[] by=msg.getBytes();
		// 3.打包(数据容器,数据长度,发送的地址(ip+端口号))
		DatagramPacket packet=new DatagramPacket(by, by.length, new InetSocketAddress("localhost",6666));
		//4.发送
		client.send(packet);
		// 5.释放资源
		client.close();
	}

}

依次运行服务器端 ,客户端,服务器端就能接受到发来的消息

TCP协议:

TCP通信同UDP通信一样,都能实现两台计算机之间的通信,通信的两端都需要创建socket对象。区别在于,UDP中只有发送端和接收端,不区分客户端与服务器端,计算机之间可以任意地发送数据。而TCP通信是严格区分客户端与服务器端的,在通信时,必须先由客户端去连接服务器端才能实现通信,服务器端不可以主动连接客户端,并且服务器端程序需要事先启动,等待客户端的连接。
在JDK中提供了两个类用于实现TCP程序**,一个是ServerSocket类,用于表示服务器端,一个是Socket类,用于表示客户端**。通信时,首先创建代表服务器端的ServerSocket对象,该对象相当于开启一个服务,并等待客户端的连接,然后创建代表客户端的Socket对象向服务器端发出连接请求,服务器端响应请求,两者建立连接开始通信。

Tcp的三次握手:
1.客户端向服务器发送请求连接
2.服务器收到请求连接,同时自己也发送一个请求到客户端,说"我已经收到你的请求了"
3.客户端收到服务端的请求,同时又向服务器发送一个请求,“好的所有都准备好了,咱们开始发送数据吧”

三次握手都通过后开始发送接受数据
要想仔细了解3次握手的这篇博客不错:
https://www.cnblogs.com/rootq/articles/1377355.html

创建一个TCP协议通信需要客户端,服务器
ServerSocket就是服务端 Socket客户端
ServetSocket常用构造方法
在这里插入图片描述常用方法
在这里插入图片描述在这里插入图片描述ServerSocket对象负责监听某台计算机的某个端口号,在创建ServerSocket对象后,需要继续调用该对象的accept()方法,接收来自客户端的请求。当执行了accept()方法之后,服务器端程序会发生阻塞,直到客户端发出连接请求,accept()方法才会返回一个Scoket对象用于和客户端实现通信,程序才能继续向下执行。

Socket
讲解了ServerSocket对象可以实现服务端程序,但只实现服务器端程序还不能完成通信,此时还需要一个客户端程序与之交互,为此JDK提供了一个Socket类,用于实现TCP客户端程序。
Socket常用构造方法
在这里插入图片描述在这里插入图片描述Socket常用方法
在这里插入图片描述

例子:客户端发送数据到服务端,服务端接受数据,再转化为大写发送给客户端

/*
* 服务端接受或发送数据
*/
public class MyServer {

	public static void main(String[] args) throws IOException {

		//创建服务端 监听8080端口号传来的消息
		ServerSocket serverSocket = new ServerSocket(8080);
		//监听客户端
		Socket socket = serverSocket.accept();
		//读取客户端发送的数据
		InputStream inputStream = socket.getInputStream();
		BufferedInputStream bis = new BufferedInputStream(inputStream);

		
		byte[] flush = new byte[1024];
        //用于存储读取到的字节个数
		int len = bis.read(flush);
		String str = new String(flush, 0, len);
		//输出客户端的数据
		System.out.println(str);

		System.out.println("端口号:"+socket.getLocalPort());
		System.out.println("ip地址:"+socket.getInetAddress());
		//将数据转为大写发给客户端
		String upString = str.toUpperCase();
		//由服务端发送数据到客户端
		OutputStream outputStream = socket.getOutputStream();
		outputStream.write(upString.getBytes());

		socket.close();
	}
}

/*
 * 客户端发送或接受数据
 */

public class MyClient {
	public static void main(String[] args) throws UnknownHostException, IOException {
		String string="abcdefg";
		//创建客户端对象 其中的参数是需要发送到服务端的ip和端口号
		Socket socket=new Socket("localhost",8080);
		//客户端向服务端发送数据
		OutputStream os=socket.getOutputStream();
		os.write(string.getBytes());
		//接受服务端的数据
		InputStream inputStream=socket.getInputStream();
		byte[] flush =new byte[1024];
		int len=inputStream.read(flush);
		//输出
		System.out.println(new String(flush,0,len));
		socket.close();
	}

}

服务器结果:
在这里插入图片描述客户端结果:
ABCDEFG

一个web网站的工作原理
在这里插入图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值