JAVA基础:网络
一.概述:
1.1 简介:
在操作系统中,网络和文件其实都是通过I/O总线连接到系统。都会有一个定位类,例如:file和Url,然后再通过input,output等I/O类才进行数据交互。本文介绍下java的网络,及其相关类。
1.2 网络协议
不同设备之间、不同进程之间的通信都是需要通信协议来格式化数据、分装,然后组装数据、反格式化数据。
a) 7层协议:

总体划分:
ISO提出的OSI(Open System Interconnection)模型将网络分为七层,即 物理层( Physical )、 数据链路层(Data Link)、网络层(Network)、 传输层(Transport)、 会话层(Session)、 表示层(Presentation)和 应用层(Application)。
| 层数 | 总结 |
|---|---|
| 1. 物理层 | 物理层(Physical layer)是参考模型的最低层。该层是网络通信的数据传输介质,由连接不同结点的电缆与设备共同构成。主要功能是:利用传输介质为数据链路层提供物理连接,负责处理数据传输并监控数据出错率,以便数据流的透明传输。 |
| 2. 数据链路层 | 数据链路层(Data link layer)是参考模型的第2层。 主要功能是:在物理层提供的服务基础上,在通信的实体间建立数据链路连接,传输以“帧”为单位的数据包,并采用差错控制与 流量控制方法,使有差错的物理线路变成无差错的数据链路。 |
| 3. 网络层 | 网络层(Network layer)是参考模型的第3层。主要功能是:为数据在结点之间传输创建逻辑链路,通过路由选择算法为分组通过通信子网选择最适当的路径,以及实现拥塞控制、 网络互联等功能。 |
| 4. 传输层 | 传输层(Transport layer)是参考模型的第4层。主要功能是向用户提供可靠的端到端(End-to-End)服务,处理数据包错误、数据包次序,以及其他一些关键传输问题。传输层向高层屏蔽了下层数据通信的细节,因此,它是计算机通信体系结构中关键的一层。 |
| 5. 会话层 | 会话层(Session layer)是参考模型的第5层。主要功能是:负责维扩两个结点之间的传输链接,以便确保点到点传输不中断,以及管理数据交换等功能。 |
| 6. 表示层 | 表示层(Presentation layer)是参考模型的第6层。主要功能是:用于处理在两个通信系统中交换信息的表示方式,主要包括数据格式变换、 数据加密与解密、数据压缩与恢复等功能。 |
| 7. 应用层 | 应用层(Application layer)是参考模型的最高层。主要功能是:为 应用软件提供了很多服务,例如文件服务器、数据库服务、 电子邮件与其他网络软件服务。 |
b) 5层协议

| 名称 | 功能 | 协议 |
|---|---|---|
| 应用层 | 文件传输、电子邮件、文件服务、虚拟终端 | TFTP(文件传输)、HTTP(万维网)、SNMP、FTP、SMTP、DNS、Telnet(远程终端接入) |
| 传输层 | 提供端对端的接口 | TCP、UDP |
| 网络层 | 为数据包选择路由 | IP、ICMP、OSPF、EIGRP、Lgmp |
| 数据链路层 | 传送有地址的帧以及错误检测功能 | SLIP、CSLIP、PPP、MTU |
| 物理层 | 以二进制数据形式在物理媒体上传输数据 | ISO2110、IEEE802、IEEE802.2 |
c) TCP数据封装

- tcp封装数据包的格式为:
- 数据帧:帧头+IP数据包+帧尾 (帧头包括源和目标主机MAC地址及类型,帧尾是校验字)
- IP数据包:IP头部+TCP数据信息(IP头包括源和目标主机IP地址、类型、生存期等)
- TCP数据信息:TCP头部+实际数据 (TCP头包括源和目标主机端口号、顺序号、确认号、校验字等)
d) tcp连接《3次握手为主》
- tcp的3次握手
![]()
- tcp的4次握手
![]()
1.3 java依赖类:
- java.net.InetAddress:ip处理类,将域名或者IP解析为 ip/域名的形式。
- java.net.URL:网络连接类。封装了InetAddress和系统网络连接。处理连接问题,和File类对文件的作用相似。
- java.net.URLConnection:网络处理类,连接后处理数据交互等功能。
- java.net.ServerSocket:服务器
- java.net.Socket:
二.案例
2.1 InAddress:地址处理
/**
* @throws Exception
* @see 域名处理:返回域名/IP
*/
@Test
public void intAddress() throws Exception {
InetAddress local = InetAddress.getLocalHost();
System.out.println("本地IP:" + local.getHostAddress());//本地IP:192.168.124.1
System.out.println("本地名称:" + local.getHostName());//本地名称:ssHss-PC
InetAddress[] local2 = InetAddress.getAllByName("www.baidu.com");//IP180.97.33.108
for (InetAddress ia : local2) {
System.out.println("IP" + ia.getHostAddress());
System.out.println("名称" + ia.getHostName());
//IP:180.97.33.108
//名称:www.baidu.com
//IP:180.97.33.107
//名称:www.baidu.com
}
}
3.2 URLConnection
/**
* @throws Exception
* @see URLConnection
* @see 域名类:URL、处理连接前的工作(协议、域名、IP、端口、连接)
* @See 连接处理类类:URLConnection、处理连接后的工作(读写)
*/
public void testURL() throws Exception {
// 域名
String urlPath = "http://www.baidu.com";
// 生成 URL类
URL url = new URL(urlPath);
// 连接
URLConnection urlconn = url.openConnection();
System.out.println("========== head ===========");
Map<String, List<String>> map = urlconn.getHeaderFields();
for (Entry<String, List<String>> entry : map.entrySet()) {
String key = entry.getKey();
List<String> value = entry.getValue();
System.out.println(key + " : " + value);
}
System.out.println("========== inputStream ================");
InputStream urlinput = urlconn.getInputStream();
/**
* 以字符
*/
BufferedReader r = new BufferedReader(new InputStreamReader(urlinput));
String readLine = null;
int line = 1;
while ((readLine = r.readLine()) != null) {
System.out.println(line + " :" + readLine);
line++;
}
/**
* 以字节
*/
// byte[] tempBytes = new byte[100];
// int byteRead = 0;
// while ((byteRead = urlinput.read(tempBytes)) != -1) {
// System.out.println(tempBytes);
// }
}
连接www.baidu.com获取的信息:
浏览器截图

console打印图:

3.3 Socket编程(TCP协议)
a) 监听80端口:
/**
* @throws IOException
* @see severSocket :服务器Socket
* @see socket:网络处理对象
*/
@Test
public void serviceSocket() throws IOException {
// 创建ServerSocket(端口)
ServerSocket server = new ServerSocket(8080);
// 监听--》阻塞(等待连接)
Socket socket = server.accept();
// 处理数据
BufferedReader buffer = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String readline = null;
while ((readline = buffer.readLine()) != null) {
System.out.println(readline);
}
}
Console图

browers图

b) Server-Clinet实例
server-socket:
/**
* @throws IOException
* @see severSocket :服务器Socket
* @see socket:网络处理对象
*/
@Test
public void serviceSocket() throws IOException {
// 创建ServerSocket(端口)
ServerSocket server = new ServerSocket(8080);
// 监听--》阻塞(等待连接)
Socket socket = server.accept();
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
System.out.println("========== server-write ===========");
out.println("你好!--我是server");
// 处理数据
BufferedReader buffer = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String readline = null;
System.out.println("========== server-read ===========");
while ((readline = buffer.readLine()) != null) {
System.out.println(readline);
}
out.close();
socket.close();
}
client:
/**
* @throws IOException
* @See clientSocket
*/
@Test
public void clientSocket() throws Exception {
Socket s = new Socket("localhost", 8080);
PrintWriter out = new PrintWriter(s.getOutputStream(), true);
System.out.println("========== client-write ===========");
out.println("你好!..我是client");
BufferedReader buffer = new BufferedReader(new InputStreamReader(s.getInputStream()));
String readline = null;
System.out.println("========== client-read ===========");
while ((readline = buffer.readLine()) != null) {
System.out.println(readline);
}
out.close();
s.close();
}


浙公网安备 33010602011771号