常见的软件结构有:
CS:客户端服务器
优点:用户体验好,可以将一些运算交给客户端执行,减轻服务器压力
缺点:开发成本高,周期长,维护成本高
BS:浏览器服务器
优点:开发成本低,周期短,维护成本低
缺点:所有运算都必须在服务器完成,服务器压力
网络编程三要素是什么
IP:计算机唯一标识
端口:进程的唯一标识
协议:确定数据传输格式
通过ip找主机,通过端口找程序,通过协议确定如何传输数据。
理解UDP协议的特点
1. UDP协议的特点
面向无连接
只管发送不管对方是否接收到
基于数据包进行数据传输
数据包大小限制在64k以内
因为面向无连接,速度快但不可靠
2. UDP协议的应用场景
* 即时通讯(QQ,微信,陌陌....)
* 在线视频
* 网络语音电话
3. UDP协议相关的类
* DatagramPacket
数据报包,比喻为集装箱
作用:用来封装要发送的数据,用来封装要接收的数据
* DatagramSocket
发送对象或接收对象,比喻为码头
作用:用来发送数据包
使用UDP协议实现发送端程序
1. UDP发送端实现步骤
1. 定义字符串:要发送的内容
2. 创建数据包对象:DatagramPacket
3. 创建数据包发送对象:DatagramSocket
4. 调用发送对象的方法发送数据包
5. 释放资源
public static void main(String[] args)throws Exception{
// 1. 定义字符串:要发送的内容
byte[] content = "你好UDP接收端,约吗".getBytes();
// 2. 创建数据包对象:DatagramPacket
DatagramPacket dp = new DatagramPacket(content, content.length,InetAddress.getLocalHost(),8888);
// 3. 创建数据包发送对象:DatagramSocket
DatagramSocket ds = new DatagramSocket();
// 4. 调用发送对象的方法发送数据包
ds.send(dp);
// 5. 释放资源
ds.close();
}
2. UDP接收端实现步骤
1. 创建数据包对象:用来存储接收到数据(DatagramPacket)
2. 创建接收对象:DatagramSocket
3. 调用接收对象的方法receive接收数据包
4. 关闭资源
public static void main(String[] args)throws Exception{
// 1. 创建数据包对象:用来存储接收到数据(DatagramPacket)
// 1.1 创建字节数组:用来存储接收到的实际数据
byte[] buf = new byte[1024];
DatagramPacket dp = new DatagramPacket(buf, buf.length);
// 2. 创建接收对象:DatagramSocket
DatagramSocket ds = new DatagramSocket(8888);
// 3. 调用接收对象的方法receive接收数据包
ds.receive(dp);// 阻塞方法
// 3.1 定义整型变量记录实际接收到的字节个数
int len = dp.getLength();
System.out.println("接收到的字节个数:" + len);
System.out.println("接收到的内容:" + new String(buf,0,len));
// 3.2 获得发送端的端口号
int port = dp.getPort();
System.out.println(port);
// 4. 关闭资源
ds.close();
}
3. DatagramPacket类常用构造方法
1. DatagramPacket(byte[] buf, int length)
创建接收端的数据包对象
buf:字节数组,用来存储要发送的数据
length:能够接收内容的长度
2. DatagramPacket(byte[] buf, int length, InetAddress address, int port)
创建发送端数据包对象
* buf:字节数组,用来存储要发送的数据
* length:要发送的内容长度,单位是字节
* address:接收端的IP地址
* port:接收端的端口号
3. DatagramSocket类常用构造方法
DatagramSocket()
创建发送端的Socket对象,随机分配端口号
DatagramSocket(int port)
创建接收端的Socket对象并指定端口号
注:
Socket编程就是网络编程
网络编程就是Socket
Socket:套接字,插座
4. DatagramSocket类常用方法
void send(DatagramPacket dp) 发送数据包
void receive(DatagramPacket dp) 接收数据包
5. InetAddress类静态方法
一个InetAddress类的对象就代表一个IP地址对象
没有构造方法,通过静态方法创建InetAddress对象,静态方法有如下两个:
static InetAddress getLocalHost(); 获得本机IP地址对象
static InetAddress getByName(String host); 根据IP地址字符串或主机名创建IP地址对象
===============================================================================================
理解TCP协议的特点
1. TCP协议的特点
面向连接的协议
通过三次握手建立连接:形成数据传输通过
通过四次挥手断开连接
基于IO流进行数据传输
传输数据大小没有限制
因为面向连接,速度慢但可靠
2. TCP协议的应用场景
文件上传和下载
邮件发送
远程登录
3. TCP协议相关的类
Socket:
* 客户端的Socket对象
* 一个该类的对象就代表一个客户端程序
ServerSocket
* 服务器端的Socket对象
* 一个该类的对象就带一个服务器程序
使用TCP协议实现客端户和服务器端之间的数据传输。
1. TCP客户端代码实现步骤
1. 创建客户端Socket对象
2. 调用Socket对象的getOutputStream方法获得字节输出流
3. 调用字节输出流的write方法输出数据到服务器端
4. 调用Socket对象的getInputStream方法获得字节输入流
5. 调用字节输入流的read方法读取服务器返回的数据
6. 关闭socket释放资源
2. Socket类构造方法
* Socket(String host, int port)
* 根据主机名或IP地址字符串和端口号创建客户端Socket对象
* host:服务器地址
* port:服务器端的端口号
3. Socket类常用方法
* OutputStream getOutputStream();
* InputStream getInputStream();
public static void main(String[] args)throws Exception{
// 1. 创建数据包对象:用来存储接收到数据(DatagramPacket)
// 1.1 创建字节数组:用来存储接收到的实际数据
byte[] buf = new byte[1024];
DatagramPacket dp = new DatagramPacket(buf, buf.length);
// 2. 创建接收对象:DatagramSocket
DatagramSocket ds = new DatagramSocket(8888);
// 3. 调用接收对象的方法receive接收数据包
ds.receive(dp);// 阻塞方法
// 3.1 定义整型变量记录实际接收到的字节个数
int len = dp.getLength();
System.out.println("接收到的字节个数:" + len);
System.out.println("接收到的内容:" + new String(buf,0,len));
// 3.2 获得发送端的端口号
int port = dp.getPort();
System.out.println(port);
// 4. 关闭资源
ds.close();
}
小结:
TCP客户端代码实现步骤
1. 创建客户端Socket对象
2. 调用Socket对象的getOutputStream方法获得字节输出流
3. 调用字节输出流的write方法输出数据到服务器端
4. 调用Socket对象的getInputStream方法获得字节输入流
5. 调用字节输入流的read方法读取服务器返回的数据
6. 关闭socket释放资源
使用TCP协议实现服务器端程序
1. TCP服务器端代码实现步骤
1. 创建ServerSocket对象:相当于开启了服务器程序
2. 调用ServerSocket对象的accept方法等待客户端连接并获得Socket对象
3. 调用Socket对象getInputStream方法获得字节输入流
4. 调用字节输入流对象的read方法读取客户端发送的数据
5. 调用Socket对象getOutputStream方法获得字节输出流
6. 调用字节输出流对象的write方法往客户端返回数据
7. 关闭serverSocket和socket对象
2. ServerSocket类构造方法
* ServerSocket(int port)
* 创建ServerSocket对象并指定端口号
* 相当于开启了服务器程序
3. ServerSocket类常用方法
Socket accept() 等待客户端连接并获得与客户端关联的Socket对象 小结:
TCP服务器端代码实现步骤:
1. 创建ServerSocket对象:相当于开启了服务器程序
2. 调用ServerSocket对象的accept方法等待客户端连接并获得Socket对象
3. 调用Socket对象getInputStream方法获得字节输入流
4. 调用字节输入流对象的read方法读取客户端发送的数据
5. 调用Socket对象getOutputStream方法获得字节输出流
6. 调用字节输出流对象的write方法往客户端返回数据
7. 关闭serverSocket和socket对象
public static void main(String[] args)throws Exception{
// 1. 创建ServerSocket对象:相当于开启了服务器程序
ServerSocket serverSocket = new ServerSocket(6666);
System.out.println("开启了服务器......");
// 2. 调用ServerSocket对象的accept方法等待客户端连接并获得Socket对象
Socket socket = serverSocket.accept();
// 3. 调用Socket对象getInputStream方法获得字节输入流
InputStream in = socket.getInputStream();
// 4. 调用字节输入流对象的read方法读取客户端发送的数据
// 创建字节数组:用来存储读取到客户端的数据
byte[] buf = new byte[1024];
int len = in.read(buf);
System.out.println("len = " + len);
System.out.println("接收到的内容:" + new String(buf,0,len));
// 5. 调用Socket对象getOutputStream方法获得字节输出流
OutputStream out = socket.getOutputStream();
// 6. 调用字节输出流对象的write方法往客户端返回数据
out.write("叔叔我们不约".getBytes());
// 7. 关闭serverSocket对象
serverSocket.close(); // 在实际开发中,服务器一般不会关闭的
}