目录
14.1 网络编程概述
-
Java提供的网络类库,可以实现无痛的网络连接,联网的底层 细节被隐藏在 Java 的本机安装系统里,由 JVM 进行控制。并 且 Java 实现了一个跨平台的网络库,程序员面对的是一个统一 的网络编程环境。
-
网络编程的目的: 直接或间接地通过网络协议与其它计算机实现数据交换,进行通讯。
-
网络编程中有两个主要的问题:
-
如何准确地定位网络上一台或多台主机;定位主机上的特定的应用
-
找到主机后如何可靠高效地进行数据传输
-
14.2 网络通信要素概述
-
IP和端口号
-
网络通信协议
1 如何实现网络中的主机互相通信
-
通信双方地址: IP、 端口号
-
一定的规则(即:网络通信协议。有两套参考模型)
-
OSI参考模型:模型过于理想化,未能在因特网上进行广泛推广
-
TCP/IP参考模型(或TCP/IP协议):事实上的国际标准。
-
![](https://img-blog.csdnimg.cn/c2633ddac1fd480ca50aff0fb90251c3.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAc3RyYW5nZV9hYQ==,size_20,color_FFFFFF,t_70,g_se,x_16)
14.3 通信要素1:IP和端口号
1 IP地址(InetAddress)
-
在java中,使用InetAddress类代表IP
-
作用:唯一的标识 Internet 上的计算机(通信实体)
-
本地回环地址(hostAddress):127.0.0.1 主机名(hostName):localhost
-
特点:不易记忆
-
分类:
-
IP地址分类方式1:IPV4 和 IPV6
-
IPV4:4个字节组成,4个0-255。大概42亿,30亿都在北美,亚洲4亿。2011年初已 经用尽。以点分十进制表示,如192.168.0.1
-
IPV6:128位(16个字节),写成8个无符号整数,每个整数用四个十六进制位表示, 数之间用冒号(:)分开,如:3ffe:3201:1401:1280:c8ff:fe4d:db39:1984
-
-
IP地址分类方式2:公网地址(万维网使用)和私有地址(局域网使用)。
-
192.168. 开头的就是私有址址,范围即为192.168.0.0--192.168.255.255,专门为组织机 构内部使用
-
-
2 InetAddress类
-
域名:
-
Internet上的主机有两种方式表示地址:
-
域名(hostName):www.baidu.com
-
IP 地址(hostAddress):14.215.177.38
-
-
域名解析:域名容易记忆,当在连接网络时输入一个主机的域名后,域名服务器(DNS) 负责将域名转化成IP地址,这样才能和主机建立连接。
-
-
InetAddress类没有提供公共的构造器,而是提供了如下几个静态方法来获取 InetAddress实例
-
public static InetAddress getLocalHost() //获取本机的IP地址
-
public static InetAddress getByName(String host) //(通过域名或具体IP值)获取指定IP地址
-
3 端口号
-
端口号标识正在计算机上运行的进程(程序)
-
不同的进程有不同的端口号, 被规定为一个 16 位的整数 0~65535。
-
端口分类:
-
公认端口:0~1023。被预先定义的服务通信占用(如:HTTP占用端口 80,FTP占用端口21,Telnet占用端口23)
-
注册端口:1024~49151。分配给用户进程或应用程序。(如:Tomcat占 用端口8080,MySQL占用端口3306,Oracle占用端口1521等)。
-
动态/私有端口:49152~65535。
-
-
端口号与IP地址的组合得出一个网络套接字:Socket。
14.4 通信要素2:网络通信协议
1 网络通信协议
计算机网络中实现通信必须有一些约定,即通信协议,对速率、传输代码、代
码结构、传输控制步骤、出错控制等制定标准。
2 TCP/IP协议簇
-
传输层协议中有两个非常重要的协议:
-
传输控制协议TCP(Transmission Control Protocol)
-
用户数据报协议UDP(User Datagram Protocol)。
-
-
TCP/IP 以其两个主要协议:传输控制协议(TCP)和网络互联协议(IP)而得 名,实际上是一组协议,包括多个具有不同功能且互为关联的协议。
-
IP(Internet Protocol)协议是 网络层的主要协议,支持网间互连的数据通信。
-
TCP/IP协议模型从更实用的角度出发,形成了高效的四层体系结构,即 物理链路层、IP层、传输层和应用层。
3 TCP和UDP
-
TCP协议:
-
使用TCP协议前,须先建立TCP连接,形成传输数据通道
-
传输前,采用“三次握手”方式,点对点通信,是 可靠的
-
TCP协议进行通信的两个应用进程:客户端、服务端。
-
在连接中可进行大数据量的传输
-
传输完毕,需释放已建立的连接, 效率低
-
-
UDP协议:
-
将数据、源、目的封装成数据包,不需要建立连接
-
每个数据报的大小限制在64K内
-
发送不管对方是否准备好,接收方收到也不确认,故是 不可靠的
-
可以广播发送
-
发送数据结束时无需释放资源, 开销小,速度快
-
14.5 TCP网络编程
基于TCP的socket通信:
![](https://img-blog.csdnimg.cn/169e674469ad49f7a63d92df1892048e.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAc3RyYW5nZV9hYQ==,size_20,color_FFFFFF,t_70,g_se,x_16)
编程:客户端发送消息给服务器端,服务器端将数据显示在控制台上
//需要使用try-catch-finally处理异常,为了方便阅读省略
public void client() throws IOException {
//1.创建Socket对象,指明服务器端的IP和端口号
InetAddress inet = InetAddress.getByName("127.0.0.1"); //服务器端的IP
Socket socket = new Socket(inet,8899);
//2.获取输出流,用于输出数据
OutputStream os = socket.getOutputStream();
//3.写出数据
os.write("我是客户端".getBytes());
socket.shutdownOutput(); //关闭数据输出
//客户端接收服务器端的消息
InputStream is = socket.getInputStream();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buffer = new byte[20];
int len;
while ((len = is.read(buffer)) != -1){
baos.write(buffer,0,len);
}
System.out.println(baos.toString());
//4.资源关闭
baos.close();
is.close();
os.close();
socket.close();
}
public void server() throws IOException {
//1.创建服务器端的ServerSocket,指明自己的端口号
ServerSocket ss = new ServerSocket(8899);
//2.调用accept()表示接受来自于客户端的socket
Socket socket = ss.accept();
//3.获取输入流
InputStream is = socket.getInputStream();
//4.读取输入流中的数据
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buffer = new byte[20];
int len;
while ((len = is.read(buffer)) != -1){
baos.write(buffer,0,len); //写入ByteArrayOutputStream类中定义的数组中
}
//显示操作
System.out.println(baos.toString()); //全部存储到baos中再去转字符串,不会出现乱码
System.out.println(socket.getInetAddress()); //获取客户端的IP地址
//服务器端给予客户端反馈
OutputStream os = socket.getOutputStream();
os.write("消息已收到".getBytes());
//5.资源关闭
os.close();
baos.close();
is.close();
socket.close();
ss.close();
}
14.6 UDP网络编程
-
UDP数据报通过数据报套接字 DatagramSocket 发送和接收,系统不保证 UDP数据报一定能够安全送到目的地,也不能确定什么时候可以抵达。
-
DatagramPacket 对象封装了UDP数据报,在数据报中包含了发送端的IP 地址和端口号以及接收端的IP地址和端口号。
-
UDP协议中每个数据报都给出了完整的地址信息,因此无须建立发送方和 接收方的连接。如同发快递包裹一样。
UDP收发数据:
//省略了try-catch-finally
//发送端
public void sender() throws IOException {
DatagramSocket socket = new DatagramSocket();
String str = "UDP发送的消息";
byte[] data = str.getBytes();
InetAddress inet = InetAddress.getLocalHost();
//UDP数据报
DatagramPacket packet = new DatagramPacket(data, 0, data.length, inet,9090);
socket.send(packet);
socket.close();
}
//接收端
public void receiver() throws IOException {
DatagramSocket socket = new DatagramSocket(9090);
byte[] buffer = new byte[100];
DatagramPacket packet = new DatagramPacket(buffer,0,buffer.length);
socket.receive(packet);
System.out.println(new String(packet.getData(),0,packet.getLength()));
socket.close();
}
14.7 URL编程
1 URL
-
URL(Uniform Resource Locator):统一资源定位符,它表示 Internet 上某一 资源的地址。
-
它是一种具体的URI,即URL可以用来标识一个资源,而且还指明了如何locate 这个资源。 通过 URL 我们可以访问 Internet 上的各种网络资源,比如最常见的 www,ftp 站点。浏览器通过解析给定的 URL 可以在网络上查找相应的文件或其他资源。
-
URL的基本结构由5部分组成:
-
<传输协议>://<主机名>:<端口号>/<文件名>#片段名?参数列表
-
例如: http://192.168.1.100:8080/helloworld/index.jsp#a?username=shkstart&password=123
-
#片段名:即锚点,例如看小说,直接定位到章节
-
参数列表格式:参数名=参数值&参数名=参数值....
-
2 URL类构造器
-
public URL (String spec):通过一个表示URL地址的字符串可以构造一个URL对象。
-
URL url = new URL ("http://www. baidu.com/");
-
-
public URL(URL context, String spec):通过基 URL 和相对 URL 构造一个 URL 对象。
-
URL downloadUrl = new URL(url, “download.html")
-
-
public URL(String protocol, String host, String file);
-
new URL("http", "www. baidu .com", “download. html");
-
-
public URL(String protocol, String host, int port, String file);
-
URL gamelan = new URL("http", "www. baidu .com", 80, “download.html");
-
3 方法
public static void main(String[] args) {
try {
URL url = new URL("http://localhost:8080/examples/1.jpg");
//获取该URL的协议名
System.out.println(url.getProtocol());
//获取该URL的主机名
System.out.println(url.getHost());
//获取该URL的端口号
System.out.println(url.getPort());
//获取该URL的文件路径
System.out.println(url.getPath());
//获取该URL的文件名
System.out.println(url.getFile());
//获取该URL的查询名
System.out.println(url.getQuery());
} catch (MalformedURLException e) {
e.getMessage();
}
}
从给定的url下载资源:
public void test2() throws IOException {
URL url = new URL("http://localhost:8080/examples/1.jpg");
//创建HTTP连接的对象
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
//获取连接
urlConnection.connect();
InputStream is = urlConnection.getInputStream();
FileOutputStream fos = new FileOutputStream("2.jpg");
byte[] buffer = new byte[1024];
int len;
while((len = is.read(buffer)) != -1){
fos.write(buffer,0,len);
}
is.close();
fos.close();
urlConnection.disconnect();
}