网络编程
网络基础
计算机网络
计算机网络是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统。
网络编程就是用来实现网络互连的不同计算机上运行的程序间可以进行数据交换。
网络通信
两台计算机通过网络进行通信,需要具备以下条件
IP地址:计算机唯一标识
协议:通讯语言/规则
端口:程序入口,不同进程的标识
TCP/IP协议
TCP/IP是目前世界上应用最为广泛的协议
是以TCP和IP为基础的不同层次上多个协议的集合
也称:TCP/IP协议族或TCP/IP协议栈
TCP:Transmission Control Protocol
传输控制协议
IP:Internet Protocol
互联网协议
TCP/IP模型
相关概念
IP地址:实现网络中不同计算机之间的通信,每台机器都必须有一个唯一的标识
端口:用于区分不同应用程序,端口号范围0-65535,其中0-1023是系统保留的端口号
IP地址和端口号组成了所谓的Socket
,Socket
是网络上运行的程序之间双向通信链路的终结点,是TCP和UDP的基础
java中的网络支持
针对网络通信的不同层次,Java提供的网络功能有四大类:在 java.net包下
InetAddress
: 用于标识网络上的硬件资源
URL
: 统一资源定位符通过URL可以直接读取或写入网络上的数据
Socket
: 使用TCP协议实现网络通信的Socket相关的类
Datagram
: 使用UDP协议,将数据保存在数据报中,通过网络进行通信
InetAddress类
此类表示互联网协议(IP)地址
常用方法
示例
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.Arrays;
public class InetAddressDemo {
public static void main(String[] args) throws UnknownHostException {
// 获取本机的IntetAddress实例
InetAddress address = InetAddress.getLocalHost();
System.out.println("计算机名:" + address.getHostName());
System.out.println("IP地址:" + address.getHostAddress());
byte[] bytes = address.getAddress();// 获取字节数组形式的IP地址
System.out.println("字节数组:" + Arrays.toString(bytes));
System.out.println(address);// 直接输出InetAddress对象
// InetAddress address2 = InetAddress.getByName("DESKTOP-JQI6O11");
InetAddress address2 = InetAddress.getByName("192.168.84.1");
System.out.println("计算机名:" + address.getHostName());
System.out.println("IP地址:" + address.getHostAddress());
/*
* 输出结果
* 计算机名:DESKTOP-JQI6O11
* IP地址:192.168.84.1
* 字节数组:[-64, -88, 84, 1]
* DESKTOP-JQI6O11/192.168.84.1
* 计算机名:DESKTOP-JQI6O11
* IP地址:192.168.84.1
*/
}
}
URL类
URL(Uniform Resource Locator) 统一资源定位符,表示Internet上某一资源的地址
URL主要由两部分组成:协议名称和资源名称,中间用冒号隔开
构造方法
常用方法
示例
import java.net.MalformedURLException;
import java.net.URL;
public class URLDemo {
public static void main(String[] args) {
try {
URL silly = new URL("http://www.silly.com");
//?后面代表参数,#后面表示锚点
URL url = new URL(silly, "/index.html?username=tom#test");
System.out.println("协议:"+url.getProtocol());
System.out.println("主机:"+url.getHost());
//如果未指定端口号,则使用默认http协议的端口号80进行访问
//对于缺省端口号getPort()方法统一返回-1
System.out.println("端口:"+url.getPort());
System.out.println("文件路径:"+url.getPath());
System.out.println("文件名:"+url.getFile());
System.out.println("相对路径:"+url.getRef());
System.out.println("查询字符串:"+url.getQuery());
} catch (MalformedURLException e) {
e.printStackTrace();
}
/*
协议:http
主机:www.silly.com
端口:-1
文件路径:/index.html
文件名:/index.html?username=tom
相对路径:test
查询字符串:username=tom
*/
}
}
使用URL读取网页内容
通过URL对象的openStream()
方法可以得到指定资源的输入流
通过输入流可以读取、访问网络上的数据
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;
public class URLDemo2 {
public static void main(String[] args) {
//创建url实例
try {
URL url = new URL("http://www.baidu.com");
//通过url的openStream方法获取url对象所表示的资源的字节输入流
InputStream is = url.openStream();
//将字节输入流转化为字符输入流
InputStreamReader isr = new InputStreamReader(is,"utf-8");
//为字符输入流添加缓冲
BufferedReader br = new BufferedReader(isr);
String data = br.readLine(); //读取数据
while(data != null){ //循环读取数据
System.out.println(data);//输出数据
data = br.readLine();
}
br.close();
is.close();
isr.close();
} catch (Exception e) {
e.printStackTrace();
}
}
/*
打印的内容就是百度首页的html文档
*/
}