网络编程
定义: 网络编程是指编写运行在多个设备(计算机)的程序,这些设备都通过网络连接起来。
IP & 域名
IP: 定位网络中的不同节点(电子设备:手机,电脑,路由器…)
互联网协议版本 | 字节数 | 位数 |
---|---|---|
IPV4 | 4个字节 | 32位 |
IPV6 | 16个字节 | 128位 |
特殊的IP:
192.168.0.0~192.168.255.255 局域网内部使用
本地IP
127.0.0.1
本地域名
localhost
DNS域名解析服务器
DNS 把域名翻译成IP地址的软件称为域名系统,即DNS。
InetAddress 此类表示互联网协议 (IP) 地址。
端口
端口: 区分不同软件
0~65535 2个字节
统一协议下端口不能冲突
设置端口号时尽量越大越好
预留端口号:8000
常见端口号:
端口号 | 对应地址 |
---|---|
80 | http |
8080 | tomcat |
1521 | Oracle |
3306 | mysql |
InetSocketAddress 此类实现 IP 套接字地址(IP 地址 + 端口号)。
互联网的三大基石: http html url
HTTP
(HyperText Transfer Protocol,超文本传输协议)
html
超文本标记语言
URL
(Uniform Resource Locator,统一资源定位符) 区分不同的资源
完整网址示例解析:
https://www.baidu.com:80/img/bd_logo1.png
符号 | 意义 |
---|---|
https:// | 协议 |
www.baidu.com | 域名 |
:80 | 端口 |
img/bd_logo1.png | 资源地址 |
?xxx | 请求参数 |
java.net中的常见两种协议支持
udp (用户数据报协议)
UDP 是用户数据报协议的缩写,一个无连接的协议。提供了应用程序之间要发送的数据的数据包。
tcp(传输控制协议)
TCP 是传输控制协议的缩写,它保障了两个应用程序之间的可靠通信。通常用于互联网协议,被称 TCP / IP。
TCP和UDP的比较
UDP | TCP | |
---|---|---|
是否连接 | 无连接 | 面向连接 |
是否可靠 | 不可靠传输,不使用流量控制和拥塞控制 | 可靠传输,使用流量控制和拥塞控制 |
连接对象个数 | 支持一对一,一对多,多对一和多对多交互通信 | 只能是一对一通信 |
传输方式 | 面向报文 | 面向字节流 |
首部开销 | 首部开销小,仅8字节 | 首部最小20字节,最大60字节 |
适用场景 | 适用于实时应用(IP电话、视频会议、直播等) | 适用于要求可靠传输的应用,例如文件传输 |
Socket 编程:
- 套接字使用TCP提供了两台计算机之间的通信机制。 客户端程序创建一个套接字,并尝试连接服务器的套接字。
- 当连接建立时,服务器会创建一个 Socket 对象。客户端和服务器现在可以通过对 Socket 对象的写入和读取来进行通信。
- java.net.Socket 类代表一个套接字,并且 java.net.ServerSocket 类为服务器程序提供了一种来监听客户端,并与他们建立连接的机制。
以下步骤在两台计算机之间使用套接字建立TCP连接时会出现:
- 服务器实例化一个 ServerSocket 对象,表示通过服务器上的 端口通信
- 服务器调用 ServerSocket 类的 accept() 方法,该方法将一 直 等待,直到客户端连接到服务器上给定的端口。
- 服务器正在等待时,一个客户端实例化一个 Socket 对象,指定服务器名称和端口号来请求连接。
- Socket 类的构造函数试图将客户端连接到指定的服务器和 端口号。如果通信被建立,则在客户端创建一个 Socket 对象能 够与服务器进行通信。
- 在服务器端,accept() 方法返回服务器上一个新的 socket 引 用,该 socket 连接到客户端的 socket。
连接建立后,通过使用 I/O 流在进行通信,每一个socket都有一个输出流和一个输入流,客户端的输出流连接到服务器端的输入流,而客户端的输入流连接到服务器端的输出流。
TCP 是一个双向的通信协议,因此数据可以通过两个数据流在同一时间发送.以下是一些类提供的一套完整的有用的方法来实现 socket。
本机 ip 套接字 url 相关代码
ip
/*
* getHostName() 获取此 IP 地址的主机名。
* getHostAddress() 返回 IP 地址字符串(以文本表现形式)。
* getAddress() 返回此 InetAddress 对象的原始 IP 地址。
*/
InetAddress i = InetAddress.getLocalHost();
System.out.println(i);// LAPTOP-9G6E024B/192.168.1.110
System.out.println(i.getHostName());// LAPTOP-9G6E024B
System.out.println(i.getHostAddress());// 192.168.1.110
InetAddress i2 = InetAddress.getByName("www.baidu.com");
System.out.println(i2);// www.baidu.com/115.239.211.112
System.out.println(i2.getHostName());// www.baidu.com
System.out.println(i2.getHostAddress());// 115.239.211.112
套接字
/*
* 端口:
* InetSocketAddress(InetAddress addr, int port)
根据 IP 地址和端口号创建套接字地址。
InetSocketAddress(int port)
创建套接字地址,其中 IP 地址为通配符地址,端口号为指定值。
InetSocketAddress(String hostname, int port)
根据主机名和端口号创建套接字地址。
*/
InetSocketAddress add1=new InetSocketAddress(i,9999);
System.out.println(add1.getHostName()); //LAPTOP-9G6E024B
System.out.println(add1.getPort()); //9999
InetSocketAddress add2=new InetSocketAddress("115.239.211.112",9999);
System.out.println(add2.getHostName()); //115.239.211.112
System.out.println(add2.getPort()); //9999
url
//url
URL url=new URL("http://www.baidu.com:80/index.html?name=zhangsan&pwd=123#a");
System.out.println(url);
System.out.println("协议:"+url.getProtocol());//http
System.out.println("域名:"+url.getHost());//www.baidu.com
System.out.println("端口:"+url.getPort());//80
System.out.println("资源:"+url.getFile());//文件名 // /index.html?name=zhangsan&pwd=123
System.out.println("资源:"+url.getPath());//路径部分 // /index.html
System.out.println("查询:"+url.getQuery());//name=zhangsan&pwd=123
System.out.println("锚点:"+url.getRef());//a