1.网络通信基础
- IP地址:计算机主体标识身份的地址,目前标准有IPv4、IPv6
- 协议:是计算机主体之间通信所要共同遵守的协议,目前应用最广泛的协议是TCP/IP
- 端口号:端口号是分别计算机上不同应用程序的通信的,端口号从0~65534,其中0~1023默认为系统保留(http:80;ftp:21)
2.TCP/IP协议
TCP/IP协议是一个协议簇,是多个协议的集合,TCP协议是指传输控制协议,IP协议是指网络通信协议。
2.1 网络分层模型
TCP/IP网络分层模型:5层(还有说法是4层,将物理层和链路层合为网络接口层)
TCP/IP参考模型 | OSI参考模型 |
应用层 | 应用层 |
表示层 | |
会话层 | |
传输层 | 传输层 |
网络层 | 网络层 |
数据链路层 | 数据链路层 |
物理层 | 物理层 |
2.2 TCP报文格式
2.3 TCP的三次握手和四次挥手
2.4 TCP/IP协议体系的常见术语
- 包
包是网络上的传输片段,也称分组。包是一种统称,在不同的协议不同的层次,包有不同的名字:如TCP/IP中,数据链路层的包叫帧(Frame);IP层的包称为IP数据报;TCP层的包常称TCP报文等。
大多数的包都由包头和信息组成和信息组成:包头常常包括诸如源地址和目的地址,包的长度和类型指示符等信息;信息部分可以是原始数据也可以包含另一个包。
- 封装
不同设备的对等层之间依靠封装和解封装来实现相互间通信。
TCP/IP也是一种计算机数据打包和寻址的标准方法。
在通信过程中,TCP/IP每一层都让数据得以通过网络进行传输,这些层之间使用协议数据单元(Protocol Data Unit,PDU)彼此交换信息,确保网络设备之间能够通信。
3.Java中对网络通信的支持
- InetAddress
- URL
- Sockets
- Datagram
3.1 InetAddress
3.2 URL(java.net)
统一资源定位符,Internet上某一资源的地址,URL由两部分组成(协议+资源名称)
/**
1. URL常用方法
*/
try {
/**
* 创建一个URL的实例
* URL的构造方法有很多种
*/
URL url = new URL("http://www.baidu.com");
/**
* 根据已存在的URL再创建一个URL实例
* ?后面的是参数,#后面的是锚点
*/
URL newurl = new URL(url,"/s?wd=http#test");
System.out.println("协议:"+url.getProtocol());
System.out.println("主机:"+url.getHost());
System.out.println("端口号:"+url.getPort());
System.out.println("文件路径:"+url.getPath());
System.out.println("文件名:"+url.getFile());
System.out.println("相对路径(即锚点):"+url.getRef());
} catch (MalformedURLException e) {
e.printStackTrace();
}
/**
2. 使用URL读取网页内容
3. @param args
4. @throws MalformedURLException
*/
public static void main(String[] args) {
try {
/**
* 创建URL实例
*/
URL url = new URL("http://www.baidu.com");
/**
* 通过URL的openstram()方法获取字节输入流
*/
InputStream in = url.openStream();
/**
* 将字节输入流转换为字符输入流
*/
InputStreamReader isr = new InputStreamReader(in,"utf-8");
/**
* 为字符输入流添加缓冲
*/
BufferedReader br = new BufferedReader(isr);
/**
* 读取数据
*/
String data = br.readLine();
while(data!=null){
System.out.println(data);
data = br.readLine();
}
in.close();
isr.close();
br.close();
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
3.3 Socket(java.net)
socket通信模型
- 1. 建立通信
服务端:创建ServerSocket对象;调用accept()方法侦听指定端口是否有客户端链接,处于阻塞状态;侦听到客户端请求后,创建Socket对象。
客户端:创建Socket对象,并向指定服务器和端口发起请求
- 2. 建立链接之后,开始通信
通过Socket获取输入输出流,开始传输消息。
- 3. 通信结束后,关闭链接及相关资源
服务端
public static void main(String[] args) {
try{
/**
* 创建ServerSocket对象,指定要绑定的端口
*/
ServerSocket serverSocket = new ServerSocket(8088);
/**
* 调用accept方法开始监听,等待客户端的链接
*/
Socket socket = serverSocket.accept();
/**
* 获取输入流
*/
InputStream in = socket.getInputStream();
InputStreamReader isr = new InputStreamReader(in);
BufferedReader br = new BufferedReader(isr);
/**
* 输出客户端提交的信息
*/
String info = br.readLine();
while(info != null){
System.out.println(info);
info = br.readLine();
}
/**
* 关闭输入流
*/
socket.shutdownInput();
/**
* 关闭其他资源
*/
in.close();
isr.close();
br.close();
}catch(IOException e){
e.printStackTrace();
}
}
客户端
public static void main(String[] args) {
try {
/**
* 创建客户端Socket,指定服务器地址和端口号
*/
Socket socket = new Socket("localhost",8088);
/**
* 获取输出流
*/
OutputStream os = socket.getOutputStream();
PrintWriter pw = new PrintWriter(os);
pw.write("hello");
pw.flush();
socket.shutdownOutput();
os.close();
pw.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}