前置网络基础知识
IP地址:IP指明计算机在网络中的地址,每一天机器必须有一个唯一的标识,就是IP地址。
协议:语言相同才能理解。
端口:区分同一台计算机上不同的应用程序。端口号范围:0-65535,其中0-1023为系统所保留。
tcp/ip: 目前世界上最广泛的协议,是以tcp和ip 为基础的不同层次上多个协议的集合,也称tcp/ip协议族。
Socket:Socket是用于描述IP地址和端口号。
Java网络相关API
1. InetAddress类的使用
InetAddress类主要用于标识网络上的硬件资源,多用来表示互联网协议IP地址相关信息。
InetAddress没有构造方法,意味着不能用new的方式去创建它的对象,不过JDK提供了一些静态方法,比如 getByName(String host)获取本机的一个实例。下图手册中展示的一些方法,这些静态方法会返回了InetAddress实例。
InetAddress具体使用查看线上手册,地址:https://www.matools.com/api/java8
案例代码
import java.net.InetAddress; import java.net.UnknownHostException; import java.util.Arrays; public class javaSocket { public static void main(String[] args) throws UnknownHostException { //根据本地主机获取InetAdress实例 InetAddress address = InetAddress.getLocalHost(); //获取计算机名 System.out.println("计算机名:"+address.getHostName()); //获取IP地址 System.out.println("IP地址:"+address.getHostAddress()); //字节数组形式的IP: byte[] bytes = address.getAddress(); System.out.println("字节数组形式的IP:"+ Arrays.toString(bytes)); //直接输出InetAddress对象 System.out.println(address); //根据机器名获取InetAdress实例 InetAddress address2 = InetAddress.getByName("songguojundeMBP.lan"); //获取计算机名 System.out.println("计算机名:"+address2.getHostName()); //获取IP地址 System.out.println("IP地址:"+address2.getHostAddress());//IP地址:127.0.1.1 //根据IP地址获取InetAdress实例 InetAddress address3 = InetAddress.getByName("127.0.0.1"); //获取计算机名 System.out.println("计算机名:"+address2.getHostName());//计算机名:rocco-All-Series //获取IP地址 System.out.println("IP地址:"+address2.getHostAddress());//IP地址:127.0.1.1 } }
打印结果
2. URL应用
URL:统一资源定位符,表示Internet上某一资源的地址,URL由两部分组成:协议名称和资源名称,中间用冒号分开
在java.net包中,提供了URL类来表示URL。创建一个URL的实例通过下图URL类的构造方法来实现。
案例代码
import java.net.MalformedURLException; import java.net.URL; public class javaSocket { public static void main(String[] args) { try { //创建一个URL实例 URL baidu = new URL("http://www.baidu.com"); //根据已经创建的URL实例,再创建一个URL实例出来 URL url = new URL(baidu, "/index.html?username=songguojun#test"); //查看协议 System.out.println("协议:" + url.getProtocol()); //查看主机 System.out.println("主机:"+url.getHost()); //查看端口 //如果未指定端口号,则根据协议的不同使用默认的端口号,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(); } } }
返回结果
使用URL类来读取指定网页内容
通过URL对象的openStream()可以用来得到指定资源的输入流
案例代码
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.MalformedURLException; import java.net.URL; /** * 测试openStream类来读取网站资源 */ public class javaSocket { public static void main(String[] args) { try { //创建一个URL实例 URL url = new URL("http://www.baidu.com"); //通过URL的openStream方法获取URL对象所表示的资源的字节输入流 InputStream is = url.openStream(); //将字节输入流转换为字符输入流 InputStreamReader isr = new InputStreamReader(is, "UTF8"); //为字符输入流添加缓冲 提高字符流读写的效率 BufferedReader br = new BufferedReader(isr); //读取数据 String data = br.readLine(); while (data != null){//循环读取数据 System.out.println(data); data = br.readLine(); } //关闭 br.close(); isr.close(); is.close(); } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }
打印结果
TCP编程
1.Socket简介
TCP协议是面向链接的,可靠的,有序的,以字节流的方式发送数据。
基于TCP协议是实现网络通信的类有两种:
1)客户端的Socket类。
2)服务器端的ServerSocket类。
Socket通信模型
Socket通信实现步骤:
1) 创建ServerSocket和Socket。
2)打开连接到Socket的输入/输出流。
3)按照协议对Socket进行读/写操作。
4)关闭输入/输出流,关闭Socket。