当前位置: 首页 > news >正文

JavaEE初阶,网络编程篇

请添加图片描述

网络编程

网络编程,指网络上的主机,通过不同的进程,以编程的方式实现网络通信(或称为网络数据传输)。
在这里插入图片描述
• 进程A:编程来获取网络资源
• 进程B:编程来提供网络资源

网络编程中的基本概念

发送端和接收端

  • 发送端:数据的发送方进程,称为发送端。发送端主机即网络通信中的源主机。
  • 接收端:数据的接收方进程,称为接收端。接收端主机即网络通信中的目的主机。

请求(客户端)和响应(服务端)
⼀般来说,获取⼀个⽹络资源,涉及到两次⽹络数据传输:

  • 请求数据的发送(客户端)
  • 响应数据的发送(服务端)
    在这里插入图片描述
Socket套接字(传输层为应用层提供的API)

定义: Socket(套接字) 是计算机网络中用于进程间通信的一种机制,允许不同主机或同一主机上的不同进程之间通过网络协议交换数据。它本质上是通信端点的抽象表示,提供了一组编程接口(API),使应用程序能够通过网络发送和接收数据。

工作原理:Socket基于客户端-服务器模型工作。服务器端Socket绑定到特定端口并监听连接请求,客户端Socket通过指定服务器的IP地址和端口号发起连接。一旦建立连接,双方可通过Socket进行双向数据传输。支持TCP(可靠连接)UDP(无连接) 两种主要协议。

传输层两个核心协议:

  • TCP
  • 有连接: TCP协议中,保存了对端信息。
  • 可靠传输: 不能保证数据包的100%到达,而是尽可能提高传输成功概率。
  • 面向字节流: 读写数据时是以字节为单位。
  • 全双工通信: 一个通信链路支持双向通信(能读也能写)
  • UDP
  • 无连接: UDP协议本身不保存对端信息。
  • 不可靠传输: 只需要发送数据,对传输成功概率的多少不关心。
  • 面向数据报: 读写数据的时候,是以一个数据报为单位,一次必须读写一个UDP数据报,不能是半个。
  • 半双工通信: 一个通信链路只支持单向通信(只能读或只能写)
UDP数据报Socket(套接字) 涉及到的核心API

DatagramSocket
DatagramSocket 是UDP Socket,用于发送和接收UDP数据报

在这里插入图片描述
在这里插入图片描述

DatagramPacket
DatagramPacket是UDP Socket发送和接收的数据报

在这里插入图片描述
在这里插入图片描述
基于上述UDP的简单理解,接下来实现一个回显服务器(EchoServer)

回显服务器,即客户端给服务器发一个数据(请求),服务器返回一个数据(响应),请求是什么就返回什么给客户端。简易版客户端服务器模型

服务端(server)code

public class UdpEchoServer {private DatagramSocket socket=null;//相当于网卡public UdpEchoServer(int port) throws SocketException {//初始化时,指定一个固定端口,让服务器来使用socket=new DatagramSocket(port);}public void start() throws IOException {//启动服务器System.out.println("服务器启动");while (true){//循环一次,就相当于处理一次请求//处理请求的过程,典型的服务器都是分成3个步骤的//1.读取请求并解析//DatagramPacket表示一个UDP数据报。此处传入的字节数组,就保存UDP的载荷部分DatagramPacket requestPacket=new DatagramPacket(new byte[4096],4096);socket.receive(requestPacket);//把读取到的二进制数据,转成字符串。只进行构造有效的部分String request=new String(requestPacket.getData(),0,requestPacket.getLength());//2.根据请求,处理并响应//由于此处写的是回显服务器。这个环节进行粗略操作(客户端发啥服务器回啥)String response=process(request);//3.把响应返回给客户端//根据response构造的DatagramPacket,发送给客户端。//此处不能使用 response.length()DatagramPacket responsePacket=new DatagramPacket(response.getBytes(),response.getBytes().length,requestPacket.getSocketAddress());//此处还不能直接发送。UDP协议自身没有保存对方的信息(不知道发给谁)//需要指定 目的IP和目的端口socket.send(responsePacket);//4.打印一个日志System.out.printf("[%s:%d] request: %s, response: %s\n",requestPacket.getAddress().toString(),requestPacket.getPort(),request,response);}}//如果后续要写别的服务器,只修改这个地方就行public String process(String request) {return request;}public static void main(String[] args) throws IOException {UdpEchoServer server=new UdpEchoServer(9090);server.start();}
}

在这里插入图片描述

客户端(client)code

public class UdpEchoClient {private DatagramSocket socket=null;//UDP本身不保存对端的信息,就自己在代码中进行保存private  String serverIp;private  int serverPort;public UdpEchoClient(String severIp,int severPort) throws SocketException {this.serverIp=severIp;this.serverPort=severPort;socket=new DatagramSocket();}public void start() throws IOException {Scanner scanner=new Scanner(System.in);while (true){//1.从控制台读取用户输入的内容System.out.println("请输入要发送的内容:");if (!scanner.hasNext()){break;}String request=scanner.next();//2.把请求发送给服务器,需要构造DatagramPacket对象//构造过程中,不仅要构造载荷,还要设置服务器的IP和端口号DatagramPacket requestPacket=new DatagramPacket(request.getBytes(),request.getBytes().length,InetAddress.getByName(serverIp),serverPort);//3.发送数据报socket.send(requestPacket);//4.接收服务器响应DatagramPacket responsePacket=new DatagramPacket(new byte[4096],4096);socket.receive(responsePacket);//5.从服务器读取的数据进行解析,打印出来String response=new String(responsePacket.getData(),0,responsePacket.getLength());System.out.println(response);}}public static void main(String[] args) throws IOException {UdpEchoClient client=new UdpEchoClient("127.0.0.1",9090);client.start();}
}

在这里插入图片描述

基于上述UDP服务器客户端模型进行再次详情解说
在这里插入图片描述
基于上述UDP回显服务器实现一个简单字典服务器

public class UdpDictServer extends UdpEchoServer{private HashMap<String,String> dict=new HashMap<>();public UdpDictServer(int port) throws SocketException {super(port);//进行词典的初始化dict.put("小猫","cat");dict.put("小狗","dog");dict.put("兔子","rabbit");dict.put("鸭子","duck");}//进行重写UDP回显服务器中的process方法@Overridepublic String process(String request){//查字典return dict.getOrDefault(request,"未找到该单词");}public static void main(String[] args) throws IOException {UdpDictServer server=new UdpDictServer(9090);server.start();}
}
TCP流Socket(套接字) 涉及到的核心API

ServerSocket
ServerSocket 是创建TCP服务端Socket的API。(专门给服务器用的)

在这里插入图片描述

Socket
Socket 是客户端Socket,或服务端中接收到客户端建立连接(accept方法)的请求后,返回的服务端Socket。不管是客户端还是服务端Socket,都是双方建立连接以后,保存的对端信息,及用来与对方收发数据的。

在这里插入图片描述

基于上述TCP的简单理解,接下来实现一个回显服务器(EchoServer)
TCP回显服务器(TcpEchoServer)代码

public class TcpEchoServer {private ServerSocket serverSocket=null;//这里和UDP服务器类似,也是在构造对象的时候,绑定端口号public TcpEchoServer(int port) throws IOException {serverSocket=new ServerSocket(port);}public void start() throws IOException {System.out.println("启动服务器");//这种情况一般不会使用fixedThreadPool,意味着同时处理的客户端连接数目就固定了ExecutorService executorService= Executors.newCachedThreadPool();while (true){//TCP来说,需要先处理客户端发来的连接//通过读写 clientSocket,和客户端进行通信//如果没有客户端发起连接,此时accept就会阻塞//主线程负责进行accept,每次accept到一个客户端,就会创建一个线程,由新线程负责处理客户端的请求Socket clientSocket=serverSocket.accept();//由于不能同时接收多个客户端的请求//processConnection(clientSocket);//使用多线程的方式来调整
//            Thread t=new Thread(()->{
//                processConnection(clientSocket);
//            });
//            t.start();//使用线程池来实现调整executorService.submit(()->{processConnection(clientSocket);});}}private void processConnection(Socket clientSocket) {System.out.printf("[%s:%d] 客户端上线!\n",clientSocket.getInetAddress(),clientSocket.getPort());try(InputStream inputStream=clientSocket.getInputStream();OutputStream outputStream=clientSocket.getOutputStream()) {//针对InputStream套了一层Scanner scanner=new Scanner(inputStream);//针对OutputStream套了一层PrintWriter writer=new PrintWriter(outputStream);//分成三个步骤while(true){//1.读取请求并解析。可以直接read,也可以借助Scanner来辅助完成if (!scanner.hasNext()){//连接断开System.out.printf("[%s:%d] 客户端下线!",clientSocket.getInetAddress(),clientSocket.getPort());}String request=scanner.next();//2.根据请求计算响应String response=process(request);//3.返回响应到客户端//outputStream.write(response.getBytes());writer.println(response);writer.flush();//4.打印日志System.out.printf("[%s:%d] request: %s, response: %s\n",clientSocket.getInetAddress(),clientSocket.getPort(),request,response);}} catch (IOException e) {throw new RuntimeException(e);}finally {try {clientSocket.close();} catch (IOException e) {throw new RuntimeException(e);}}}private String process(String request) {return request;}public static void main(String[] args) throws IOException {TcpEchoServer server=new TcpEchoServer(9090);server.start();}
}

TCP客户端(TcpEchoClient)代码

public class TcpEchoClient {private Socket socket=null;public TcpEchoClient(String serverIp,int serverPort ) throws IOException {//直接把字符串的IP地址,设置进来//如127.0.0.1这种字符串socket=new Socket(serverIp,serverPort);}public void start(){Scanner scanner=new Scanner(System.in);try(InputStream inputStream=socket.getInputStream();OutputStream outputStream=socket.getOutputStream()) {//将字节流进行字符串化(套一层)Scanner scannerNet=new Scanner(inputStream);PrintWriter writer=new PrintWriter(outputStream);//从控制台读取请求发送给服务器while (true){//1.从控制台读取用户的输入String request=scanner.next();//2.发送给服务器writer.println(request);//加上刷新缓冲区操作,才能够达到真正发送数据的效果writer.flush();//3.读取服务器返回的响应String response=scannerNet.next();//4.打印到控制台System.out.println(response);}} catch (IOException e) {throw new RuntimeException(e);}}public static void main(String[] args) throws IOException {TcpEchoClient client=new TcpEchoClient("127.0.0.1",9090);client.start();}
}

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

http://www.dtcms.com/a/548975.html

相关文章:

  • 基于中值滤波和高斯平滑的三维点云数据滤波matlab仿真
  • Java设计模式应用--装饰器模式
  • 【MATLAB例程】基于梯度检测自适应的互补滤波 vs 标准互补滤波,附MATLAB代码下载链接,可直接运行,方便学习和修改成自己想要的程序
  • 在检验铸铁平台精度使用三研法检验有哪些好处
  • 用Blender制作室内效果图宜居之地
  • blender4.5 使用外部IDE(pycharm)编辑脚本(bpy)实践指南
  • 计算机的一点基础知识
  • 广州网站建设 乐云seo国外优秀论文网站
  • CSS 图像拼合技术
  • 【C++】模板进阶 | 继承
  • 排名优化网站建设长沙网站建设优化
  • 厦门网站优化服务pyhton做网站
  • 论文阅读笔记——数据增强
  • 如何裁剪YOLOv8m的大目标检测头并验证其结构
  • 扩展阅读:目标检测(Object Detection)标注
  • MR30分布式IO:破局锂电池制造产线,引领高效生产新变革
  • AI赋能科研创新:ChatGPT-4o与DeepSeek-R1在学术研究中的深度应用指南
  • 《数据库系统》SQL语言之分组查询与分组过滤(理论理解分析+实例练习)
  • 家乡介绍网页设计海口seo网络推广
  • 【ROS2】动作服务器:rclcpp_action::Client 详解
  • 红松APP首秀北京老博会,“有温度的科技”赋能退休兴趣生活
  • 【ZEGO即构开发者日报】Soul AI Lab开源播客语音合成模型;腾讯混元推出国内首个交互式AI播客;ChatGPT Go向用户免费开放一年......
  • 数据库基础-数据库的三级模式
  • 图书馆网站建设调查问卷wordpress小工具自定义
  • 前端兼容性与调试技巧完全指南
  • 深度解析 Rust 的数据结构:标准库与社区生态
  • 关于组态软件的三个误解
  • 需要使用耐高温过炉治具的产品类型
  • qt QPushButton 启用选中状态(按钮可切换状态)
  • 河北云网站建设免费空间做网站