目录
- 初识网络编程
- 网络传输模型
- 网络传输协议
- UDP
- UDP通信程序
- UDP的三种通信方式
- TCP
- TCP通信协议
- TCP的三次握手
- TCP的四次挥手
初识网络编程
网络编程三要素
IP
- 设备在网络中的地址,是唯一的标识。
端口号
- 应用程序在设备中唯一的标识。
协议
- 数据在网络中传输的规则,常见的协议有UDP、TCP、http、https、ftp。
InetAddress类的使用api接口
网络传输模型
- OSI参考模型:世界互联协议标准,全球通信规范,单模型过于理想化,未能在因特网上进行广泛推广
- TCP/IP参考模型(或TCP/IP协议):事实上的国际标准。
TCP/IP四层模型
网络传输协议
计算机网络中,连接和通信的规则被称为网络通信协议
UDP协议
- 用户数据报协议(User Datagram Protocol)UDP是面向无连接通信协议。
- 速度快,有大小限制一次最多发送64K,数据不安全,易丢失
UDP协议不管发送接收两方是否已经连接成功,它只管发送
TCP协议
- 传输控制协议TCP(Transmission Control Protocol)TCP协议是面向连接的通信协议。
- 速度慢,没有大小限制,数据安全。
TCP协议会先确认发送方和接收方二者是否成功连接,再进行发送
UDP
UDP通信程序
发送数据
public static void main(String[] args) throws IOException {
//发送数据
//1.创建DatagramSocket对象
DatagramSocket ds = new DatagramSocket();
//2.打包数据
String str = "hello world!";
byte[] bytes = str.getBytes();
InetAddress address = InetAddress.getByName("127.0.0.1");
int port = 10086;//指定发送到哪个端口
DatagramPacket packet = new DatagramPacket(bytes, bytes.length, address, port);
//3.发送数据
ds.send(packet);
//4.释放资源
ds.close();
}
接收数据
public static void main(String[] args) throws IOException {
//1.创建DatagramSocket对象
DatagramSocket ds = new DatagramSocket(10086);
//2.接收数据包
byte[] bytes = new byte[1024];//定义接收数据的数组
//定义接收数据的容器
DatagramPacket packet = new DatagramPacket(bytes, bytes.length);
ds.receive(packet);//该方法是阻塞的,程序执行到这一步的时候,会在这里死等等发送端发送消息
//3.解析数据包
//就是获取发送时封装的内容
byte[] data = packet.getData();
int len = packet.getLength();
InetAddress address = packet.getAddress();
int port = packet.getPort();
System.out.println("接收该数据"+ new String(data,0,len ));
System.out.println("该数据是从"+address+"这台电脑的"+port+"这个端口发出的");
//4.关闭资源
ds.close();
}
注意:要先运行接收数据的代码,再运行发送数据的代码,否则,发送的数据接收不到
UDP的三种通信方式
①单播
一对一传输数据,发送方和接收方一 一对应
②组播
接收方为一组,给一组电脑发送信息
示例如下
发送端
接收端
③广播
给局域网中的所有电脑发送数据,广播地址是UDP独有的
TCP
TCP通信协议
TCP通信协议是一种可靠的网络协议,它在通信的两端各建立一个Socket对象通信之前要保证连接已经建立
通过Socket产生IO流来进行网络通信
下面是idea中使用TCP做通讯实现的代码
客户端
public static void main(String[] args) throws IOException {
//TCP协议发送数据
//1.创建Socket对象
//细节:在创建对象的同时会连接服务端
// 如果连接不上,代码会报错
Socket socket = new Socket("127.0.0.1",10086);
//2.从连接通道中获取输出流
OutputStream os = socket.getOutputStream();
//写出数据
os.write("hello".getBytes());
//3.释放资源
os.close();
socket.close();
}
服务端
public static void main(String[] args) throws IOException {
//TCP协议, 接收数据
//1.创建对象ServerSocker
ServerSocket ss = new ServerSocket(10000);
//2.监听客户端的连接
Socket socket = ss.accept();
//3.从连接通道中获取输入流读取数据
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
int b;
while ((b = br.read()) != -1){
System.out.print((char) b);
}
//4.释放资源
socket.close();
ss.close();
}
TCP的三次握手
确保连接建立
TCP的四次挥手
确保连接断开,且数据处理完毕,这就是为什么TCP协议可靠的原因
这里是为了确认服务端是否已经将数据处理完毕,处理完才会确认断开连接