什么是网络编程
网络上的主机,通过不同的进程,以编程的方式实现网络通信。即便是同一个主机,只要是不同进程,基于网络来传输数据,也属于网络编程。
基本概念
发送端和接收端
发送端:数据的发送方进程,发送端主机即网络通信中的源主机
接收端:数据的接收方进程,接收端主机即网络通信中的目的主机
请求和响应
获取一个网络资源涉及到两次网络数据传输:
第一次,请求数据发送
第二次,响应数据发送
客户端和服务端
服务端:在常见的网络数据传输场景下,把提供服务的一方进程称为服务端可以对外提供服务
客户端:获取服务的一方进程
常见的客户端服务端模型
客户端是指给用户使用的程序,服务端是提供用户服务的程序:
1.客户端先发送请求到服务端
2.服务端根据请求数据,执行相应的业务处理
3.服务端返回响应:发送业务处理结果
4.客户端根据响应数据,展示处理结果
Socket套接字
socket套接字是由系统提供,用于网络通信的技术,是基于TCP/IP协议的网络通信的基本操作单元。基于socket套接字的网络程序开发就是网络编程
分类
针对传输层协议分为三类:
流套接字:使用传输层TCP协议
数据报套接字:使用传输层UDP协议
原始套接字
Java数据报套接字通信模型
对于UDP协议来说,具有,无连接、面向数据报的特征,即每次都是没有建立连接并且一次发送全部数据报,一次接收全部数据报
Java中使用UDP协议通信,主要基于DatagramSocket类来创建数据报套接字,并使用DatagramPacket作为发送或接收的UDP数据报。对于一次发送及接收UDP数据报的流程如下:
以上只是一次发送端的UDP数据报发送,及接收端的数据报接收,并没有返回的数据。也就是只有请求,没有响应。对于一个服务端来说,重要的是提供多个客户端的请求处理及响应,流程如下
Java流套接字通信模型
UDP数据报套接字编程
DatagramSocket API
DatagramSocket是UDP Socket,用于发送和接收UDP数据报
DatagramSocket 构造方法
DatagramPacket API
DatagramPacket是UDP Socket发送和接收的数据报
DatagramPacket方法
构造UDP发送的数据报时,需要传入 SocketAddress ,该对象可以使用InetSocketAddress 来创
建。
实例:一发一收 无响应
UDP服务端
package org.example.udp.demo1; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.util.Arrays; public class UdpServer { //服务器socket要绑定固定的端口 private static final int PORT = 8888; public static void main(String[] args) throws IOException { // 1.创建服务端DatagramSocket,指定端口,可以发送及接收UDP数据报 DatagramSocket socket = new DatagramSocket(PORT); //不停的接收客户端udp数据报 while (true){ // 2.创建数据报,用于接收客户端发送的数据 byte[] bytes = new byte[1024];//1m=1024kb, 1kb=1024byte, UDP最多 64k(包含UDP首部8byte) DatagramPacket packet = new DatagramPacket(bytes, bytes.length); System.out.println("------------------------------------------------ ---"); System.out.println("等待接收UDP数据报..."); // 3.等待接收客户端发送的UDP数据报,该方法在接收到数据报之前会一直阻塞,接收到数 据报以后,DatagramPacket对象,包含数据(bytes)和客户端ip、端口号 socket.receive(packet);