基本概念
分层思想
将这样一个大而复杂的系统分解为若干个小而简单的子系统,然后再逐个加以处理 —— 分层
ISO / OSI 网络参考模型
OSI模型的7层:应用-表示-会话-传输-网络-数据链路-物理
TCP / IP 网络参考模型
一组用于实现网络互连的通信协议
协议的5层:应用-传输-网络-数据链路-物理(相比OSI,没有表示层和会话层)
- Internet网络体系结构以TCP/IP为核心
TCP / IP网络一些基本概念:
- IP 地址
- Port 端口号
- Socket 套接字:用于通信的端点由Socket定义,Socket由IP地址和Port组成
- TCP(传输控制协议):面向连接的保证可靠传输的协议
- UDP(用户数据报协议):无连接的传输协议,不能保证绝对的安全可靠,但是简单、效率高
- 域名:服务器地址
- URL(统一资源定位器):Internet上某一资源的地址
- 语法格式:
<协议>://<主机号:端口号>/完整文件名/资源中的某个特定位置
- 语法格式:
Java提供的网络编程类
InetAddress(IP地址封装类)
- 不能通过new来创建实例,需要利用静态方法获取
object = InetAddress.getByName("hostname");
object = InetAddress.getLocalHost();
object = InetAddress.getAllByName("hostname");
6.2 Socket 接口
通信的一般步骤:
- 先在服务器端生成一个ServerSocket实例对象,并通过
accept()
方法随时监听客户端的连接请求 - 当客户端需要连接时,相应地要生成一个Socket实例对象,并发出连接请求
- 服务器端通过
accept()
方法接收到客户端的请求后,开辟一个接口与之进行连接,并生成所需的I/O数据流 - 客户端和服务器端的通信都是通过一对InputStream和OutputStream进行的。通信结束后,两端分别关闭对象的Socket接口
import java.io.*;
import java.net.Socket;
public class Client { //客户端
public static void main(String[] args) throws Exception {
Socket socket = new Socket("202.102.144.106", 8080);
InputStream in = socket.getInputStream();
OutputStream out = socket.getOutputStream();
DataInputStream din = new DataInputStream(in);
DataOutputStream dout = new DataOutputStream(out);
for(int i = 0; i < 10; i++) { //传输10个整数给客户端
dout.writeInt((int) (Math.random() * 100) +1);
}
int max = din.readInt(); //接收最大值
dout.close(); //关闭资源
din.close();
out.close();
in.close();
socket.close();
}
}
import java.net.*;
import java.io.*;
public class Server { //服务器端
public static void main(String[] args) throws Exception {
ServerSocket ss = new ServerSocket(5432);
Socket socket = ss.accept();
InputStream in = socket.getInputStream();
OutputStream out = socket.getOutputStream();
DataInputStream din = new DataInputStream(in);
DataOutputStream dout = new DataOutputStream(out);
int max = 0;
for(int i = 0, tmp = 0; i < 10; i++) {
max = Math.max(din.readInt(), max); //接收10个整数,求其最大值
}
dout.writeInt(max); //传输最大值给客户端
dout.close(); //关闭资源
din.close();
out.close();
in.close();
socket.close();
ss.close();
}
}