网络编程基础
一、基础知识
1.1、计算机网络
所谓计算机网络,就是把分布在不同区域的计算机与专门的外部设备用通信线路相互连接成一个规模大,而且功能强的网络系统,从而使得计算机之间可以相互传递信息,共享数据、软件等资源。
网络分类 :按照地理范围:广域网( Internet) ,城域网( 一个城市、多个城市,长城宽带),局域网(机房)。
1.2 网络编程
所谓网络编程(不是网站编程),指的就是在同一个网络中不同机器之间的通信。
1.3 网络参考模型
OSI参考模型(共七层):
- 物理层
- 数据链路层
- 网络层
- 传输层
- 会话层
- 表示层
- 应用层
TCP/IP参考模型(共四层):
- 网络访问层(数据链路层/物理层):包括操作系统中的设备驱动程序、计算机中对应的网络接口卡。
- 网际层:处理分组在网络中的活动,比如分组的选路。
- 传输层:主要为两台主机上的应用提供端到端的通信。
- 应用层(应用层/表示层/会话层):负责处理特定的应用程序细节。
模型图:
1.4 通信协议
需要通信的设备之间需要实现相同的通信协议才能进行通信。
TCP/IP网络分层:网络访问层、互联网层、传输层、应用层
通信协议分类:
- 互联网IP协议:IPV4和IPV6,互联网协议
- 传输层协议:TCP和UDP
- 应用层协议:HTTP
TCP协议:
TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。数据大小无限制。建立连接的过程需要三次握手,断开连接需要四次挥手。
UDP协议:
UDP 是User Datagram Protocol的简称, 中文名是用户数据报协议,是TCP/IP参考模型中一种无连接 的传输层协议,提供面向事务的简单不可靠信息传送服务,每个包的大小64Kb。
IP协议:
IP(Internet Protocol网际协议)能使连接到网上的所有计算机网络实现相互通信的一套规则,规定了计算 机在因特网上进行通信时应当遵守的规则。IP协议中包含一块非常重要的内容就是为计算机分配了一个唯一标识即 IP地址。
2、计算机之间的通信
2.1 IP地址
IP地址指的是互联网地址(Internet Protocol Address ) ,是联网设备与互联网之间的唯一标识,在同一个网段 中,IP地址是唯一的。IP地址是数字型的,是一个32位的整数,通常将其分成4个8位的二进制数,每8位之间用圆点隔开, 每个8 位整数可以转换为一个0~255的十进制整数,例如:202.9.128.88。
IP地址有一套旧的IP地址(IPV4)和一套新的IP地址(IPV6),IPV4一共32位,IPV6公有128位;windows下输出入“ipconfifig“ 查看本机IP地址,Linux下输入 “ifconfig” 查看IP地址。
IPV4地址分类
- A类:保留给政府结构,1.0.0.1 ~ 126.255.255.254
- B类:分配给中型企业,128.0.0.1 ~ 191.255.255.254
- C类:分配给任何需要的个人,192.0.0.1 ~ 223.255.255.254
- D类:用于组播,224.0.0.1 ~ 239.255.255.254
- E类:用于实验,240.0.0.1 ~ 255.255.255.254
- 回环地址:127.0.0.1,指本机,一般用于测试使用,使用ping命令测试: ping 127.0.0.1
IP地址可以唯一的确定网络上的一个通信实体,但一个通信实体可以有多个通信程序同时提供网络服务,此时还需要使用端口。
2.2 端口
数据的发送和接收都需要通过端口出入计算机,端口号用于唯一标识通信实体上进行网络通讯的程序,同一台机器上不能两个程序占用同一个端口。
端口号的取值范围:0~65535;
查看端口占用: netstat -ano;
端口分类:
- 公认端口:0~1023
- 注册端口:1024~49151
- 动态或私有端口:49152~65535
常用端口:
- mysql:3306
- oracle:1521
- tomcat:8080
- web服务器(http):80
- ftp服务器:21
- SMTP 25
- POP3 110
3、相关类
(1)InetAddress
Java提供了InetAddress类来代表ip地址,是对ip地址的抽取和封装,有两个子类:Inet4Address,Inet6Address,分别表示IPv4和IPv6。
常用方法:
InetAddress的构造函数不是公开的(public),所以需要通过它提供的静态方法来获取,还有一些有关主机名和主机IP地址的常用方法如下表:
方法 | 描述 |
static InetAddress[] getAllByName(String host) | 根据主机名或者IP地址获取所有InetAddress对象 |
static InetAddress getByAddress(byte[] addr) | 根据IP地址结合获取InetAddress对象 |
static InetAddress getByAddress(String host,byte[] addr) | 根据主机名和IP地址的集合获取InetAddress对象 |
static InetAddress getByName(String host) | 根据主机名或IP地址获取InetAddress对象 |
static InetAddress getLocalHost() | 返回主机名+主机IP地址 |
static String getHostAddress() | 获取主机IP地址的字符串表示形式 |
static String getHostName() | 获取主机名 |
示例:
package basis.stuJavaNet;
import java.net.InetAddress;
import java.net.UnknownHostException;
public class TestInetAddress {
public static void main(String[] args) {
InetAddress address = null;
try {
address = InetAddress.getLocalHost();
System.out.println(address);//vainglory/169.254.196.98
} catch (UnknownHostException e) {
e.printStackTrace();
}
String strAddress = address.getHostAddress();
System.out.println(strAddress);//169.254.196.98
String hostName = address.getHostName();
System.out.println(hostName);//vainglory
try {
address = InetAddress.getByName("10.21.9.146");
System.out.println(address);///10.21.9.146
address = InetAddress.getByName("wwww.baidu.com");
System.out.println(address);//wwww.baidu.com/123.125.114.144
} catch (UnknownHostException e) {
e.printStackTrace();
}
InetAddress[] addresses = null;
try {
addresses = InetAddress.getAllByName("www.baidu.com");
} catch (UnknownHostException e) {
e.printStackTrace();
}
for (InetAddress address1:addresses){
System.out.println(address.toString());
}
}
}
(2)URLEncoder类和URLDecoder类
URLEncoder类和URLDecoder类用于完成普通字符串和application/x-www-form-urlencoded MIME字符串之间的转换。
URLEncoder.encode(String s, String enc) :
使用指定的编码机制将字符串转换为 application/x-www-form-urlencoded 格式
URLDecoder.decode(String s, String enc) :
使用指定的编码机制对 application/x-www-form-urlencoded 字符串解码。
发送的时候使用URLEncoder.encode编码,接收的时候使用URLDecoder.decode解码,都按指定的编码格式进行编码、解码,可以保证不会出现乱码。主要用来http get请求不能传输中文参数问题。http请求是不接受中文参数的。这就需要发送方,将中文参数encode,接收方将参数decode,这样接收方就能收到准确的原始字符串了。
示例:
package basis.stuJavaNet;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.net.URLEncoder;
public class TestEncode {
public static void main(String[] args) {
String data = "Java你好。";
try {
String encode_data = URLEncoder.encode(data,"UTF-8");
System.out.println(encode_data);//Java%E4%BD%A0%E5%A5%BD%E3%80%82
String decode_data = URLDecoder.decode(encode_data,"UTF-8");
System.out.println(decode_data);//Java你好。
//编码和解码要使用相同的字符串,否则会出现乱码
decode_data = URLDecoder.decode(encode_data,"GBK");
System.out.println(decode_data);//Java浣犲ソ銆�
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
}
运行结果:
Java%E4%BD%A0%E5%A5%BD%E3%80%82
Java你好。
Java浣犲ソ銆�