网络编程
概念
网络
将不同区域的电脑连接在一起。
包括局域网、城域网、互联网。
IP地址
确定网络上一个绝对位置|地址 --> 房子的地址。
- 特殊的IP:
- 192.168.0.0 ~ 192.268.255.255 非注册ip,供公司组织内部使用的ip地址
- ip --> 域名:由DNS服务器解析
- 127.0.0.1 (本地IP) --> localhost (本地域名)
端口号
确定计算机上的软件 --> 房间号。
大小为2 byte,0~65535,共65536个。
- 在同一个协议下,端口号不能重复,不同协议可以;
- 0~1024以下的端口号不要使用,80 --> HTTP, 21 --> FTP,tomcat --> 8080,oracle --> 1521,mysql --> 3306。
资源定位
- URL(Uniform Resource Locator):统一资源定位符;
- URI(Uniform Resource Identifier):统一资源。
数据传输
-
协议:TCP / UDP
- TCP (Transfer Control Protocol):面向连接、安全可靠、效率低,类似于电话,三次握手;
- UDP (User Datagram Protocol):非面向连接、效率高、安全性低,类似于短信;
-
传输:
- 封装;
- 拆封。
需要用到的类
InetAddress_InetSocketAddress
InetAddress
封装计算机的 IP地址、DNS。
-
静态方法获取对象
- InetAddress.getLocalHost();
- InetAddress.getByName(“www.163.com”); // 参数为域名
- InetAddress.getByName(“192.168.145.2”); // 参数为IP地址
-
方法
- getHostAddress(); // 返回IP地址
- getHostName(); // 返回域名 | 本机为计算机名
InetSocketAddress
封装 端口。(在InetAddress的基础上 + 端口)
-
创建对象
- InetSocketAddress(int port)
- 创建套接字地址,其中 IP 地址为通配符地址,端口号为指定值
- InetSocketAddress(String hostname, int port);
- 根据主机名和端口号创建套接字地址
- InetSocketAddress(InetAddress addr, int port);
- 根据 IP 地址和端口号创建套接字地址。
- InetSocketAddress(int port)
-
方法
- getHostName();
- getAdderss();
- getPort();
URL
统一资源定位符,互联网的三大基石之一(http、html、url)
由4部分组成:
- 协议
- 存放资源的主机域名
- 端口号
- 资源文件名
创建
- URL(String spec); // 绝对路径构建
- URL(URL context, String spec); // 相对路径构建
方法
URL u = new URL("http://www.baidu.com:80/index.html#aa?cansu=bjsxt");
System.out.println("获取与此url关联的协议的默认端口:"+u.getDefaultPort());
System.out.println("getFile:"+u.getFile()); //端口号后面的内容
System.out.println("主机名:"+u.getHost()); //www.baidu.com
System.out.println("相对路径:"+u.getPath()); //端口号后,参数前的内容
System.out.println("端口:"+u.getPort()); //存在返回80.否则返回-1
System.out.println("协议:"+u.getProtocol());
System.out.println("参数:"+u.getQuery()); //存在锚点,返回null;否则返回true
System.out.println("锚点:"+u.getRef());
URL u = new URL("http://www.abc.com/aa/");
URL u2 = new URL(u,"2.html"); //相对路径构建url对象
System.out.println(u2.toString()); //http://www.abc.com/aa/2.html
流
openStream();
UDP通信
以数据为中心,非面向连接,不安全,数据可能丢失,效率高
类 :
- DatagramSocket
- DatagramPacket
UDP编程:
-
客户端:
- 创建 客户端:DatagramSocket 类 + 指定端口
- 准备数据:字节数组
- 打包数据:DatagramPacket 类 + 服务器地址 及 端口
- 发送
- 释放资源
// 1.创建客户端 DatagramSocket client = new DatagramSocket(6666); // 2.准备数据 String msg = "UDP编程"; byte[] data = msg.getBytes(); // 3.打包数据(发送的地址 及 端口) DatagramPacket packet = new DatagramPacket(data, data.length, new InetSocketAddress("localhost", 8888)); // 4.发送数据 client.send(packet); // 5.释放 client.close();
-
服务器端:
- 创建 服务器端:DatagramSocket 类 + 指定端口
- 准备接收容器:字节数组 封装 DatagramPacket
- 包 接受数据
- 分析
- 释放资源
// 1.创建服务端 + 端口 DatagramSocket server = new DatagramSocket(8888); // 2.准备接收容器 byte[] container = new byte[1024]; // 3.封装成包 DatagramPacket packet = new DatagramPacket(container, container.length); // 4.接收数据 server.receive(packet); // 5.分析数据 byte[] data = packet.getData(); int len = packet.getLength(); System.out.println(new String(data, 0, len)); // 6.释放 server.close();
Socket通信
基于 TCP:面向连接,安全可靠,效率低,类似于打电话。
面向连接
- 请求——Request
- 响应——Response
Socket编程
-
服务器:ServerSocket
// 1.创建服务端,指定端口:ServerSocket(int port) ServerSocket server = new ServerSocket(8888); // 2.接收客户端连接(阻塞式) while(true) { // 死循环,可以接收多个客户端,一个accept()一个客户端 Socket socket = server.accept(); System.out.println("LinkStart!"); // 3.发送数据 + 接收数据 String msg = "Welcome!"; // 4.输出流 DataOutputStream dos = new DataOutputStream(socket.getOutputStream()); dos.writeUTF(msg); dos.flush(); }
-
客户端:Socket
// 1.建立客户端,必须指定服务器地址|端口,此时就开始连接 Socket client = new Socket("localhost", 8888); // 2.接收数据 + 发送数据 DataInputStream dis = new DataInputStream(client.getInputStream()); String echo = dis.readUTF(); System.out.println(echo);