javase的网络编程(InetAddress,UDP,TCP,URL,Socket,DatagramSocket)
通过一段时间对java网络编程相关内容的学习,写下这篇随笔,对这一部分的知识进行梳理和总结。
网络编程
一、网络编程三要素:
IP地址:网络会给每个联网的主机分配一个数字的编码地址,该地址就是IP地址(本地回送地址,Localhost:127.0.0.1)。
IPV4, IPV6 ,
MAC地址:每个主机在出厂前(网卡),都会被分配一个数字地址,改地址对应所有网卡具有唯一性,就叫做MAC地址(物理地址)。
网络端口:每个程序都有一个数字的标示,以使得数据在传输的时候能够识别对应的程序,该数字就叫做 端口(逻辑端口)。
系统常用:0到1024, 我们可分配:0到65535
网络协议:定义的一个网络通信的规则。国际组织定义的通用协议:TCP/IP;UDP/IP(这个是传输层网络层的协议)
二、网络模型:
OSI 参考模型: 应用层 : 表示层 : 会话层 : 传输层 : 网络层 : 数据链路层 : 物理层
TCP/IP 参考模型: 应用层 : 传输层 : 网络层 : 主机至网络层
三、IP地址:
Java中,将对ip地址的操作方法封装成了对象,我们找到相关对象,查看其方法就可以操作网络ip地址了。
InetAddrss: 一个操作IP地址的类。(在 java.net包中)
特点: 没有构造方法,但是却有非静态方法,所以一定有一个静态方法能让我们拿到一个该类对象。
对象方法:
static InetAddress getLocalHost() 返回本地主机
static InetAddress getByName(String host) 在给定主机名的情况下确定主机的 IP 地址。
static InetAddress[] getAllByName(String host) 在给定主机名的情况下,根据系统上配置的名称服务
返回其 IP 地址所组成的数组。
获取方法:
String getCanonicalHostName() 获取此 IP 地址的完全限定域名。
String getHostAddress() 返回 IP 地址字符串(以文本表现形式),重点掌握。
String getHostName() 获取此 IP 地址的主机名。
异常:UnknownHostExceprion
四、端口号
用于表示进程的逻辑地址,是不同进程的标示。
有效端口:0 ~ 65535 .其中0~1024为系统端口或保留端口。
也就是说,端口没有对象。
五、传输协议
重点掌握。
UDP协议:
1、不需要建立连接,即 面向无连接。
2、将数据及源和目的封装成数据包,每个包的大小不能超过64k。
3、因为是无连接协议, 所以是不可靠的。
4、因为不需要连接,所以传输速度很快。
如:聊天,视频会议,直播。
TCP协议:
1、建立连接,形成数据传输的通道。
2、在连接中进行大数据传输。
3、通过三次握手完成传输,是可靠协议。
4、必须会建立连接,效率会稍低。
如:下载。
Socket:
1、其不是协议,是为网络服务提供的一种机制。(翻译为:套接字)
2、通信的两端都有Socket。
3、网络通信其实就是Socket之间的通信。
4、数据在两个Socket之间通过IO传输。
所以:不同的协议有不同的Socket
五。一)UDP协议传输:
1、数据发送的思路:
1)、建立upsocket服务。
2)、提供数据,并将数据封装到包中。
3)、通过socket服务的发送功能将数据发送出去。
4)、关闭资源。
2、数据接受的思路:
1)、定义一个udpsocket服务。 通常会定义一个端口,其实就是给这个网络应用程序定义一个数字标示。
方便明确哪些数据可以被该程序处理。(构造的时候就可以定义)
2)、定义一个数据包,该包用于存储接收到的数据。
该包对象中有更多功能提取处理到字节数据中的不同信息。
3)、通过socket服务的receive方法将接收到的数据存入到已经定义好的数据包中。(阻塞方法)
4)、通过数据包特有同功能将这些不同的数据取出,并作出处理。
5)、关闭资源。
主要示例演示:
建立服务: DatagramSocket ds = new DatagramSocket(10000)
建立一个服务并指定监听端口为10000.
数据包 : DatagramPacket dp1 = new DatagramPacket(buf,buf.length,InetAddress.getHostAddress("***8"),port);
建立一个数据发送包,发送的数据在字节数组buf中,并且指定长度,发送到指定ip地址的指定端口。
DaragramPacket dp2 = new DatagramPacket(buf,buf.length);
建立一个数据接收包,接收的数据存在指定的字节数组的指定位置中。
数据发送与接收:
ds.send(dp1); 发送一个数据包。
ds.receive(dp2); 接收一个数据包。
关闭资源: ds.close();
ip地址是可能发生变化的,还有防火墙等保护软件,都有可能造成数据传递的丢失。
所以要调用本机IP的时候,要么临时获取,要么使用"LocalHost",要么使用 “127.0.0.1 ”
五。二)、TCP协议传输:分为客户端和服务端,(Socket and ServerSocket)
1、客户端:
注意)、通过查阅API,发现该类一创建就可以建立一个连接通道,连接一个主机。
因为TCP是面向连接的,所以在建立Socket服务时,就要有服务端的存在,
并连接成功,形成通路后,在该通道进行传输。
1)、创建Socket服务器,并指定要连接的主机和端口.
new Socket(InetAddress i, int port)
2)、为了发送和就收数据,要获取Socket通道的 输出流 和 输入流。
getInputStream() getOutputStream()
3)、通过流对象类操作(发送或者接收)数据。
IO方法
3)、关闭Socket服务器。
(s.close(); s.shutdownInput(); s.shutdownOutput() )
2、服务端:
1)、建立ServerSocket服务器,并指定要监听的端口。
new ServerSocket(int port);
new ServerSocket(int port, int backlog );这个方法还规定了同时连接到服务器的客户端个数。
2)、获取连接过来的客户端对象:
通过ServerSocket的 accept方法获取这个对象。(没有连接就会等,该方法阻塞)
Socket s = ss.acceput();
3)、如果客户端发来数据,那么服务端就要使用对应客户端的对象,通过该对象的输入和输出流来操作数据。
getInputStream() getOutputStream()
4)、关闭服务端(可选)、 关闭客户端(可选)
ss.close(); s.close(); s.shutdownInprt(); s.shutdownOutput()
注意:UDP使用的是send、receive和数据包传送数据。
TCP使用的是 accept连接客户端,流对象传输数据。
六、URL 和 URI
他们都是统一定位标识符。
将一个服务器地址定位字符串封装成为一个对象, 我们可以通过该对象的方法来获取这个字符串中代表各部分的子串。
我们在拿到该对象之后,通过解析该对象知道其访问途径上的各种参数。
构造方法:
URL(String spec) 根据 String 表示形式创建 URL 对象。
URL(String protocol, String host, int port, String file) 根据指定 protocol、host、port 号和 file 创建 URL 对象。
常用方法:
String getFile() 获取此 URL 的文件名。
String getHost() 获取此 URL 的主机名(如果适用)。
String getPath() 获取此 URL 的路径部分。
int getPort() 获取此 URL 的端口号(如果封装信息中没有端口号这一项,就会返回 -1,所以我们在解析一个
URL对象的时候,会对该返回值进行判断,如果为-1, 就默认访问 服务器所在主机的 80 端口,
由此可见,我们在使用浏览器访问各个服务器时都是默认在访问该主机的80端口,即 web 80端口)。
String getProtocol() 获取此 URL 的协议名称。
String getQuery() 获取此 URL 的查询部分。
如:以上方法对一个
URL url = new URL("http://192.168.1.100:8080/myweb/Demo.html?jjj");拿到的是:
//getFile >>>/myweb/Demo.html?jjj
//getHost >>>192.168.1.100
//getPath >>>/myweb/Demo.html
//getPort >>>8080
//getQuery >>>jjj
//getProtocol >>>http
重要方法:
URLConnection openConnection() 返回一个 URLConnection 对象,它表示到 URL 所引用的远程对象的连接。
就是说,只要调用URL对象的openConnection方法,其就会其连接该对象
内部封装字符串所对应的服务器,并且返回一个 URLConnection方对象。
七:URLConnection
表示 封装了应用层协议(http)后的远程连接通道的对象, 该对象内部已经封装了 Socket对象(TCP协议)和应用层协议,
并且已经实现了远程连接。(相当于建立了一个客户端,从传输层到了应用层)
获取方法:
使用URL的 openConnection方法获取该连接对象。
常用方法:
InputStream getInputStream() 返回从此打开的连接读取的输入流。
OutputStream getOutputStream() 返回写入到此连接的输出流。
八:域名解析
1、当我们在浏览器上访问时,输入的是: http://192.168.1.254:8080 时,表示本次访问使用的应用层协议是:http,
访问的主机是ip地址为192.168.1.254的主机, 且访问的是该主机的8080端口。
2、当我们在浏览器上访问时,输入的是: http://19.168.1.254时,表示本次访问使用的是应用层协议:http
访问的主机是ip地址为192.168.1.254的主机,且访问的是默认端口80.
3、当我们在浏览器上访问时,输入的是:http://www.baidu.com的时候,表示本次访问的应用层协议是:http
之后会在本地的 : c:\windows\systems\drivers\ext\host 的映射文件上查找相关主机名称和ip地址的额映射表。
(该表中存有一些ip地址和主机名称的映射关系),当本地有这个名称的映射关系时,就使用本地记录的ip地址来
进行网络访问。(现在的访问方式同2)
4、当在3中的访问方式中,没有在本地找到映射关系时,浏览器会在网络中的公共服务器 NDS 上进行查找,该服务器上
记录了大量的域名和主机ip地址的映射关系,我们查找到这个地址,拿回本地进行网络主机访问。
5、当我们在本地没有找到指定域名的映射关系,在网络DNS 服务器上也没有找到对应的映射关系时,
就会显示: 找不到该页面(或者 该页面不存在)
九、获取InetAddress的各种方法:
使用InetAddress 的自身的方法(无构造):
static InetAddress getLocalHost() 返回本地主机
static InetAddress getByName(String host) 在给定主机名的情况下确定主机的 IP 地址。
static InetAddress[] getAllByName(String host) 在给定主机名的情况下,根据系统上配置的名称服务
返回其 IP 地址所组成的数组。
使用DatagramPacket 中的方法:
InetAddress getAddress()
使用Socket 中的方法:
InetAddress getInetAddress()
(之后使用InetAddress的getHostName 和 getHostAddress()等到指定主机的ip, 和名称)
十、网络编程的其他注意事项
1、在使用自己本机的服务器时,要使用自己的浏览器访问自己的服务器, 使用地址为: 本机IP:服务器端口
但是要注意的是,不能使用 https//协议, 只能使用http//协议,或者本地不带http访问。
而IP地址是本机IP(127.0.0.1),或者本机的网络IP(一般是路由器分配的局域网IP),或者是:LocalHost。
当该服务器是自己写的服务器时,且没有定义网络http协议的情况下,只能使用不带http访问。