Day 31 学习分享 初识网络编程

1. 网络编程基础
1.1 计算机网络概念

	所谓计算机网络, 就是把分布在不同区域的计算机与专门的外部设备用通信线路互相连接成一个规模大而且功能强的网络系统
	从而使得计算机之间可以互相传递信息, 共享数据等资源

1.2 网络编程的目的

	网络编程指的就是[在同一个网络中不同机器之间的通信], 直接或间接地通过网络协议与其他计算机进行通讯 
1.3 网络编程的主要问题
	1. 如何准确的定位网络上的一台或多台主机
	2. 找到主机后如何可靠并且高效的进行数据传输		
2. 计算机之间通信的需求条件
2.1 网络通讯协议

	通过计算机网络可以使多台计算机实现连接, 位于同一个网络中的计算机在进行连接和通信时需要遵守一定的规则, 就好比道路中行驶的汽车需要遵守交通规则. 
	在计算机网络中, 这些连接和通信的规则被称为网络通信协议, 他对数据的传输格式, 传输速率, 传输步骤等做了统一规定
	通信双方必须同时遵守才能完成数据交换.


国际标准TCP/IP协议:
	TCP/IP协议有四层, 分别是应用层, 传输层, 网络层和链路层, 每层都有对应的不同功能.
	链路层:
		链路层是用于定义物理传输通道, 通常是对某些网络连接设备的驱动协议, 例如针对光纤或者网线提供的驱动
	网络层:
		网络层是整个TCP/IP协议的核心, 他主要用于将传输的数据进行分组, 将分组数据发送到目标计算机或者网络
	传输层:
		主要使网络程序进行通信, 在进行网络通信时, 可以采用TCP协议也可以采用UDP协议
	应用层:
		主要负责应用程序的协议, 例如HTTP协议(网站开发), FTP协议(文件传输)或者SMTP协议(邮件发送)
2.2 IP地址和端口号
2.2.1 IP地址:InetAddress

	要想使网络中的计算机能够进行通信, 必须为每台计算机指定一个标识号, 通过这个标识号来指定接受数据的计算机或者发送数据的计算机
	在TCP/IP协议中, 这个标识号就是IP地址, IP地址对于一台主机来说就相当于人类的身份证, 是可以进行身份辨别的一种唯一标识!
	
	tips: 127.0.0.1是本地回环地址, 代表当前电脑自己的IP地址
2.2.2 端口号

	端口号, 用于标识计算机上运行的进程
	不同的进程有不同的端口号, 标识计算机上的不同程序
	端口号被规定为一个16位的整数 0 ~ 65535. 其中, 0 ~ 1023 被预先定义的服务通信占用
	除非我们要访问这些特定服务, 否则就应该使用1024 ~ 65535这些端口中的某一个进行通信, 以免发生端口冲突

端口分类:
	公认端口:
		0~1023,它们紧密绑定于一些服务,通常这些端口的通讯明确表明了某种服务的协议
		如:80端口对应与HTTP通信,21端口绑定与FTP服务,25端口绑定于SMTP服务,135端口绑定与RPC(远程过程调用)服务。
		
	注册端口:
		1024~49151,它们松散的绑定于一些服务,也就是说有许多服务绑定于这些端口,这些端口同样用于其他许多目的
		如:许多系统 处理端口从1024开始
		
	动态或私有端口:
		49152~65535,理论上,不应为服务分配这些端口,通常机器从1024开始分配动态端口
		例外:SUN的RPC端口从32768开始。
2.3 InetAddress类
常用API:
	static InetAddress getByName(String host);
		在给定主机名的情况下确定主机的IP地址
	static InetAddress getLocalHost();
		返回本地主机
	String getHostName();
		获取此IP地址的主机名
	String getHostAddress();
		返回IP地址字符串(以文本形式表现)

public class InetAddressDemo {

	public static void main(String[] args) {

		try {
			InetAddress inetAddress = InetAddress.getByName("www.baidu.com");
			System.out.println("inetAddress="+inetAddress);
			
			//获取inetAddress对应的域名:
			System.out.println(inetAddress.getHostName());
			
			//获取inetAddress对英国的IP地址
			System.out.println(inetAddress.getHostAddress());
			
			//获取本机的域名和ID地址
			InetAddress localHost = InetAddress.getLocalHost();
			System.out.println(localHost);
			
		} catch (UnknownHostException e) {
			e.printStackTrace();
		}
	}
}
3. TCP与UDP协议
3.1 TCP协议

TCP:
	Transmission Control Protocol  传输控制协议
	
	TCP协议是面向连接的通信协议, 即在传输数据前先在发送端和接收端建立逻辑链接, 然后再传输数据, 它提供了两台计算机之间[可靠无差错]的数据传输
	在TCP连接中必须要明确客户端与服务器, 由客户端向服务器发出连接请求, 每次连接的创建都需要经过【"三次握手"】
	第一次握手,客户端向服务器端发出连接请求,等待服务器确认
	第二次握手,服务器端向客户端回送一个响应,通知客户端收到了连接请求
	第三次握手,客户端再次向服务器端发送确认信息,确认连接
	以保证传输数据的安全性,所以是一个被广泛采用的协议
	例如在下载文件时,如果数据接收不完整,将会导致文件数据丢失而不能被打开,因此,下载文件时必须采用TCP协议
3.2 UDP协议

UDP:
	User Datagram Protocal 用户数据包协议
	
	UDP是无连接通信协议,即在数据传输时,数据的发送端和接收端不建立逻辑连接
	简单来说,当一台计算机向另外一台计算机发送数据时,发送端不会确认接收端是否存在,就会发出数据
	同样接收端在收到数据时,也不会向发送端反馈是否收到数据

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

	但是在使用UDP协议传送数据时,由于UDP的面向无连接性,不能保证数据的完整性
	因此在传输重要数据时不建议使用UDP协议
3.3 小结
TCP协议:
	使用TCP协议前,须先建立TCP连接,形成传输数据通道
	传输前,采用“三次握手”方式,是可靠的
	TCP协议进行通信的两个应用进程:客户端、服务端
	在连接中可进行大数据量的传输
	传输完毕,需释放已建立的连接,效率低  

UDP协议:
	将数据、源、目的封装成数据包,不需要建立连接
	每个数据报的大小限制在64K内
	因无需连接,故是不可靠的
	发送数据结束时无需释放资源,速度快 容易丢失数据
4. TCP通信
4.1 TCP通信原理

	TCP能实现两台计算机之间的通信,通信的两端都需要创建socket对象

	TCP通信是严格区分客户端与服务器端的,在通信时,必须先由客户端去连接服务器端才能实现通信
	服务器端不可以主动连接客户端,并且服务器端程序需要事先启动,等待客户端的连接
	在JDK中提供了两个类用于实现TCP程序,一个是ServerSocket类,用于表示服务器端,一个是Socket类,用于表示客户端

	通信时,首先创建代表服务器端的ServerSocket对象,该对象相当于开启一个服务,并等待客户端的连接
	然后创建代表客户端的Socket对象向服务器端发出连接请求,服务器端响应请求,两者建立连接开始通信。
4.2 ServerSocket

类名:
	ServerSocket(int port)
        创建绑定到特定端口的服务器套接字
        
	在开发TCP程序时, 首先需要创建服务器端程序. JDK的java.net包中提供了一个ServerSocket类
	该类的实例对象可以实现一个服务器段的程序.使用该构造方法在创建ServerSocket对象时, 就可以将其绑定到一个指定的端口号上(参数port就是端口号)

API:
	Socket accept();
		侦听并接收到此套接字的连接
	InetAddress getInetAddress();
		返回此服务器套接字的本地地址
            
    ServerSocket 对象负责监听某台计算机的某个端口号,在创建ServerSocket 对象后, 需要继续调用该对象的accept() 方法,接收来自客户端的请求
    当执行了accept()方法之后, 服务器端程序会发生阻塞
    直到客户端发出连接请求, accept()方法才会返回一个Scoket对象用于和客户端实现通信, 程序才能继续向下执行
4.3 Socket

	只实现服务器端程序还不能完成通信,还需要一个客户端程序与之交互,为此JDK提供了一个Socket类,用于实现TCP客户端程序
	
	Socket(String host, int port)
		创建一个流套接字并将其连接到指定主机上的指定端口号
	Socket(InetAddress address, int port)
		创建一个流套接字并将其连接到指定IP地址的指定端口号
		

API:
	int getPort();
		该方法返回一个int类型对象, 该对象是Socket对象与服务器端连接的端口号
		
	InetAddress getLocalAddress();
		该方法用于获取Socket对象绑定的本地IP地址, 并将IP地址封装成InetAddress类型的对象返回
		
	void close();
		该方法用于关闭Socket连接, 结束本次通信, 在关闭socket之前应将于socket相关的所有输入/输出流全部关闭, 以便在程序执行完毕时释放所有的资源
		
	InputSream getInputStream();
		该方法返回一个InputStream类型的输入流对象, 如果该对象是由服务器端的Socket返回, 就用于读取客户端发送的数据
		反之, 用于读取服务器端发送的数据
		
	OutputStream getOutputStream();
		该方法返回一个OutputStream类型的输出流对象, 如果该对象是由服务器端的Socket返回, 就用于向客户端发送数据
		反之, 用于向服务器端发送数据
	
5. UDP通信
5.1 UDP通信原理
	UDP是无连接通信协议,即在数据传输时,数据的发送端和接收端不建立逻辑连接
	简单来说,当一台计算机向另外一台计算机发送数据时,发送端不会确认接收端是否存在,就会发出数据
	同样接收端在收到数据时,也不会向发送端反馈是否收到数据

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

	但是在使用UDP协议传送数据时
	由于UDP的面向无连接性,不能保证数据的完整性
	因此在传输重要数据时不建议使用UDP协议
5.2 DatagramPacket类
DatagramPacket(byte[] buf, int length)
	构造DatagramPacket 用来接收长度为length的数据包
	
	该构造方法在创建DatagramPacket对象时,指定了封装数据的字节数组和数据的大小,没有指定IP地址和端口号
	
常用API:
	InetAddress getAddress();
		
	int getPort();
	
	byte[] getData();
	
	int getLength();
5.3 DatagramSocket类
	DatagramPacket数据包的作用就如同是“集装箱”,可以将发送端或者接收端的数据封装起来
	然而运输货物只有“集装箱”是不够的,还需要有码头
	在程序中需要实现通信只有DatagramPacket数据包也同样不行
	为此JDK中提供的一个DatagramSocket类, 使用这个类的实例对象就可以发送和接收
	
常用API:
	void receive(DatagramPacket d);
	
	void send(DatagramPacket d);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值