计算机网络:
是指地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统
网络编程:
就是用来实现网络互连的不同计算机上运行的程序间可以进行数据交换。
网络模型:
计算机网络之间以何种规则进行通信,就是网络模型研究的问题
计算机网络:
-
- 两台或更多的计算机组成的网络
- 同一网络内的任意两台计算机都可以直接通信
- 所有计算机必须遵循同一种网络协议
- 互联网:网络的网络
- IP地址:计算机在网络中的标识
- 用于唯一标识一个网络接口 Network Interface
- IPv4采用32位地址,类似101.202.99.12
- IPv6采用128位地址,类似2001:0DA8:0000:0000:1020:F2F3:1428
- 公网IP地址可以直接被访问
- 内网IP地址只能在内网访问
- 192.168.x.x
- 10.x.x.x
- 本机地址使用127.0.0.1
- 用于唯一标识一个网络接口 Network Interface
- 网关:负责连接多个网络
- 协议:TCP/IP协议(泛指互联网协议)
- IP协议
- 分组交换,不保证可靠传输
- TCP协议
- 传输控制协议,面向连接,可靠传输,双向通信
- UDP协议(User Datagram Protocol)
- 数据报文协议,无连接,不保证可靠传输,传输效率高
- 语音、视频、通信数据传输
- IP协议
- TCP协议:面向连接,可靠传输
TCP编程模型:
//客户端
Socket sock = new Socket(InetAddress,port); //连接到远程服务器的指定接口
InputStream in = sock.getInputStream();
OutputStream out = sock.getOutputStream(); //读写字节流
//服务器端
ServerSocket ss = new ServerSocket(port); //监听指定端口
Socket sock = ss.accept();
InputStream in = sock.getInputStream();
OutputStream out = sock.getOutputStream(); //读写字节流
- 客户端使用Socket(InetAddress,port)打开Socket
- 服务器端用ServerSocket监听端口
- 服务器端用accept接收连接并返回Socket
- 双方通过Socket打开IputStream/OutputStream读写数据
- flush()用于强制输出缓冲区
TCP多线程编程
- 服务器端:
- 用多线程同时处理多个客户端的连接
- 使用是无限循环
//服务器端
ServerSocket ss = new ServerSocket(port);
for(;;) {
Socket sock = ss.accept();
Thread t = new Thread() {
public void run() {
process(sock);
}
};
t.start();
}
- 每次accept返回后,创建新的线程来处理客户端请求
- 每个客户端请求对应一个服务线程
- 使用线程池可以提高运行效率
UDP编程
- 可以直接接收和发送数据
//客户端
DatagramSocket sock = new DatagramSocket();
sock.connect(addr,9090);
//发送
byte[] data = ...
DatagramPacket packet = new DatagramPacket(data,data.length);
sock.send(packet);
//接收
byte[] buffer = new byte[1024];
DatagramPacket resp = new DatagramPacket(buffer,buffer.length);
sock.receive(resp);
//服务器端
DatagramSocket ds = new DatagramSocket(9090);
for(;;) {
//接收:
byte[] buffer = new byte[1024];
DatagramPacket packet = new DatagramPacket(buffer,buffer.length);
ds.receive(packet);
//发送:
byte[] data = ...;
packet.setData(data);
ds.send(packet);
}
UDP编程模型:
- 客户端使用DatagramSocket.connect()指定远程地址和端口
- 服务器端用DatagramSocket(port)监听端口
- 双方通过receive/send读写数据
- 没有IO流接口