第二章 网络编程
网络编程基础
1.TCP/IP基本概念:
计算机网络:
通过一定的物理设备将处于不同位置的计算机连接起来组成网络
- 网络最主要的作用在于共享设备和传输数据
- 无论是共享或传输数据,务必需要保证准确地匹配目的主机
IP地址和域名:(主机识别)
-
为了准确的定位目标主机,网络中的每个设备都会有一个唯一的数字标识(网络设备的IP地址)
— IP地址,是网络中资源共享、数据传输的依据
— 想查找当前局域网内打印及,可通过10.7.10.200精准匹配
-
由于IP地址不易记忆,引入网络域名来确认IP地址(域名www.baidu.com相对于119.75.218.77来说,更容易记忆)
端口:(应用程序)
主机端口精确地确定客户访问的是主机的哪一个应用程序
- 在一台主机上,应用程序可以占用任何一个端口号;一旦应用程序占据这个端口号,其它应用将不能再占用该端口
- 在主机中,端口号1~1024是系统保留端口号,用来为常用的网络服务程序所占用。用户自定义应用程序,最好占用其它端口号
例如:HTTP服务默认占用80端口,FTP服务占用21端口,SMTP服务占用25端口等
TCP/UDP协议:
确定好目标主机和应用程序之后,就可以进行网络传输。网络传输过程中,数据的传递有两种最常见的形式:
1.TCP传输控制协议:
-
是一种面向连接的、可靠的、基于字节流的传输层通信协议
-
需要首先在网络两端建立安全连接,再进行数据传输,确保网络双方完整无误地传输数据
2.UDP用户数据报协议:
-
是一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务
-
无需建立网络双方连接,直接发送数据包(包含目的地址信息),可能因为网络问题导致数据传输失败等问题,但是传输速度很快,常用于局域网中传输数据。
2.网络编程简介
网络编程
是指通过编程方式实现两个(或多个)设备之间的数据传输。
- 网络编程是基于“请求-响应”模式的:网络中A端发出请求,B端接收请求后响应A端的请求。
- “请求方”:客户端;“响应方”:服务器端
- 网络编程在客户端和服务器端之间传输数据采用TCP方式或UDP方式
网络编程开发模式:
- 客户端/服务器端(C/S模式):
对于不同的服务器端程序建立不同的客户端程序
-
C/S模式应用程序的开发包括开发客户端应用程序和服务器端应用程序
-
客户端应用程序开发步骤:
1.客户端建立与服务器端的连接(通过IP和端口确定服务器端程序)
2.客户端封装请求数据,发送给服务器端
3.客户端获得服务器端响应数据,解析并处理数据
4.客户端关闭网络连接
-
服务器端应用程序开发步骤:
1.服务器端监听特定端口
2.服务器端接收客户端连接
3.服务器端接收客户端请求数据,解析并处理请求数据
4.服务器端封装响应数据,发送给客户端
5.服务器端关闭网络连接
-浏览器/服务器端模式(B/S模式):
对于不同的服务器端程序使用统一的“客户端”(即浏览器)即可
- B/S模式应用程序开发,只需要开发服务器端应用程序即可
- 由于客户端使用浏览器访问,服务器端应用程序本质上属于Web应用程序
- 浏览器和服务器通信协议采用HTTP协议
- Java网络编程核心类
java.net.
:网络类包,涵盖常用网络操作类*java.io.
:数据消息传输包,在网络双方进行数据传递需要使用该包中的类
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OaF5LR5p-1686968325675)(C:\Users\wuruoheng\AppData\Roaming\Typora\typora-user-images\image-20230617095946138.png)]
3.URL及应用
-
使用Socket进行网络编程,从网络传输层角度进行分析,适用于绝大多数网络连接方式;但是需要开发人员熟练掌握网络传输、网络协议等基础知识,开发难度较大
-
在Java语言中,提供了一组URL处理类,封装了Socket编程技术的实现细节,用来方便开发人员进行网络连接、网络数据传输等常用的网络任务
- 直接使用URL类,可以方便地处理各种常见协议的网络连接
- 使用URL类进行网络连接,相当于直接进行远程输入/输出流操作,只需开发人员熟练掌握常用IO操作即可,大大降低开发难度
URL类:
统一资源定位符,指向互联网“资源”的指针
常用构造方法:
URL(String url);
// 通过给定字符串建立URL对象
常用方法:
InputStream openStream();
// 打开当前URL连接的输入流
URLConnection openConnection();
// 建立URL网络连接
URL myURL = new URL("http://java.sun.com");
String protocal = myURL.getProtocol();
String host = myURL.getHost();
String file = myURL.getFile();
int port = myURL.getPort();
String ref = myURL.getRef();
System.out.println(protocal + ", " + host + ", " + file + ", " + port + ", " + ref);
URLConnection
类:
-
应用程序和 URL 之间的通信链接,用于读取和写入此 URL 引用的资源
-
对象建立方法:
-通过URL对象的openConnection()
方法创建
-使用构造方法:URLConnection( URL url)
-
常用方法:
-获得响应消息头类方法:getContentType()、getContentLength()、getContentEncoding()
、……
-获得响应消息主体:getContent()
-获得当前连接输入/输出流对象:getInputStream()、getOutputStream()
url = new URL("http://"); // 打开连接 URLConnection conn = url.openConnection(); // 得到输入流 InputStream is = conn.getInputStream(); // 关于IO流的用法和写法一定要熟悉 OutputStream os = new FileOutputStream("d:\\baidu.png"); byte[] buffer = new byte[2048]; int length = 0; while (-1 != (length = is.read(buffer, 0, buffer.length))) { os.write(buffer, 0, length); } is.close(); os.close();
HttpURLConnection
类:特定支持HTTP
协议的URLConnection
- 对象建立方法:
通过URL对象的openConnection()
方法创建,强制转换为目标对象
使用构造方法:HttpURLConnection( URL url)
- 常用方法:
从URLConnection
类继承的方法
针对HTTP请求响应消息的特定方法:getRequestMethod()、setRequestMethod()、getResponseCode()、getResponseMessage()
、……
URL网络编程实例:文件下载
- 创建URL对象:
URL url = new URL( 文件地址 )
- 获取服务器端输入流:
InputStream is = url.openStream()
- 文件读写:从输入流中读取字节写入到输出流(文件)中
String sUrl = "http://pic42.nipic.com/20140608/12504116_194242259000_2.jpg";
URL url = new URL(sUrl); // 创建URL对象
InputStream in = url.openStream(); // 获得网络输入流
// 创建文件输出流
FileOutputStream out = new FileOutputStream(“cat.jpg");
int b;
while ((b = in.read()) != -1) {
out.write(b); // 写入文件
}
// 关闭输入输出流
out.close();
in.close();
URL网络编程实例:获取响应信息
- 访问网址:http://software.hebtu.edu.cn/
- 获取该网页的服务器字符编码、文档类型、服务器响应状态码、网页主体等
//创建URL对象
URL u = new URL(http://software.hebtu.edu.cn/);
//进行连接
URLConnection connection = url.openConnection();
HttpURLConnection hc = (HttpURLConnection) connection;
// 获得响应消息头
conn.getContentType();
conn.getContentLength();
conn.getContentEncoding();
// 获得HTTP消息状态码
hc.getResponseCode();
hc.getResponseMessage();
// 获得HTTP响应消息主体
hc.getContent();