【JavaEE 初阶(六)】网络编程

❣博主主页: 33的博客❣
▶️文章专栏分类:JavaEE◀️
🚚我的代码仓库: 33的代码仓库🚚
🫵🫵🫵关注我带你了解更多网络知识

在这里插入图片描述

目录

  • 1.前言
  • 2.浅谈网络
    • 2.1基本知识
    • 2.2.OSI与TCP/IP
  • 3.网络编程
    • 3.1TCP与UDP区别
    • 3.2UDP网路编程
    • 3.3TCP网络编程
  • 4.总结

1.前言

在日常生活中,我们处处都需要用到网络,比如我们在自己的电脑上编辑一条信息是如何发送到对方的电脑上的呢?我相信通过对网络的学习大家一定有不少的收获。

2.浅谈网络

2.1基本知识

网络的发展:单机时代-局域网时代-广域网时代-移动互联网时代
局域网:把几个电脑通过一个路由器连接到一起
广域网:把更多的局域网连接在在一起
IP地址:描述了一台设备在网络上的地址
端口号:不同程序关联了不同的端口号,一个端口号只能绑定一个程序但是一个程序可以绑定多个端口号。
协议:一种约定
五元组:源IP地址,目的IP地址,源端口号,目的端口号,协议类型
协议分层:如果搞一个大的协议来解决所有问题,那么这个协议就会非常的胖达,所以我们就进行拆分,由于通信实在太复杂,拆分出来的小协议就非常多,所以就进行了分层,约定了不同层次之间的调用关系,上层协议调用下层协议,下层协议给上层协议提供支持。

2.2.OSI与TCP/IP

OSI七层网络模型仅仅是在教科书中出现,在日常的生活中并不常见。TCP/IP五层网络协议是七层网络模型的简化版本。
在这里插入图片描述
1.物理层:描述的是通信网络的硬件设备,例如网线或者光纤。
2.数据链路层:两个相邻节点的传输情况,负责设备之间的数据帧的传送和识别。
3.网络层:进行路径规划,负责地址管理和路由选择。
4.传输层:关注起点和终点,负责两台主机之间的数据传输。
5.应用层:如何使用这个数据
注意

  • 对于一台主机,它实现了从物理层到应用层,5层
  • 对于一台路由器,它实现了物理层到网络层,3层
  • 对于一台交换机,它实现了从物理层到数据链路层,2层
    对于集线器,只实现物理层

3.网络编程

通过网络,可以让两个主机进行通信。进行网络编程的时候,需要操作系统提供API,这组API其实就是Socket API可以认为是应用层和传输层之间交互的路径。通过这组API就可以完成不同主机,不同系统之间的通信。

3.1TCP与UDP区别

传输层提供了2个协议是:TCP和UDP,那有什么区别呢?
TCP是有连接的,UDP是无连接的:TCP保存了对方信息,UDP没有保存
TCP是可靠的,UDP是不可靠的:TCP消息发出能够知道是否到达,UDP不知道。
TCP是面向字节流,UDP是面向数据报:TCP以字节为单位传输,UDP以数据报为单位进行传输
TCP和UDP都是全双工:允许双向通信

3.2UDP网路编程

让客户短发送一个请求,服务器收到请求以后返回发给客户端,再显示:
服务器:

package UDP;import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;public class UdpEchoServer {DatagramSocket socket=null;//设置端口号public UdpEchoServer(int port) throws SocketException {socket=new DatagramSocket(port);}//启动服务器public void start() throws IOException {System.out.println("启动服务器");while (true){//1、读取请求解析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.响应回到客户端DatagramPacket responsePacket=new DatagramPacket(response.getBytes(),response.getBytes().length,requestpacket.getSocketAddress());socket.send(responsePacket);//4.打印日志System.out.printf("[%s:%d] req=%s, resp=%s\n",requestpacket.getAddress().toString(),requestpacket.getPort(),request,response);}}private String process(String request) {return request;}public static void main(String[] args) throws IOException {UdpEchoServer udpEchoServer=new UdpEchoServer(9090);udpEchoServer.start();}
}

客户端:

package UDP;
import java.io.IOException;
import java.net.*;
import java.util.Scanner;
public class UdpEchoClient {DatagramSocket socket=null;String ip="";int port=0;public UdpEchoClient(String ip,int port) throws SocketException {socket=new DatagramSocket();this.ip=ip;this.port=port;}//客户端启动public void start() throws IOException {Scanner scanner=new Scanner(System.in);while (true){System.out.println("->");//控制台输入数据作为请求String request=scanner.next();//发送请求DatagramPacket requestpacket=new DatagramPacket(request.getBytes(),request.getBytes().length, InetAddress.getByName(ip),port);socket.send(requestpacket);//读取响应DatagramPacket responsepacket=new DatagramPacket(new byte[4096],4096);socket.receive(responsepacket);//打印响应String response=new String(responsepacket.getData(),0,responsepacket.getLength());System.out.println(response);}}public static void main(String[] args) throws IOException {UdpEchoClient udpEchoClient=new UdpEchoClient("127.0.0.1",9090);udpEchoClient.start();}
}

3.3TCP网络编程

客户端:

package TCP;import java.io.*;
import java.net.Socket;
import java.util.Scanner;public class TcpEchoClient {Socket socket=null;public TcpEchoClient(String IP,int port) throws IOException {socket=new Socket(IP,port);}//服务器启动public void start(){System.out.println("客户端启动!");Scanner scanner=new Scanner(System.in);try (InputStream inputStream=socket.getInputStream();OutputStream outputStream=socket.getOutputStream()) {PrintWriter writer=new PrintWriter(outputStream);Scanner scannernet=new Scanner(inputStream);while (true){System.out.println("->");String request=scanner.next();//发送请求writer.println(request);writer.flush();//读取响应String response=scannernet.next();//打印响应System.out.println(response);}} catch (IOException e) {e.printStackTrace();}}public static void main(String[] args) throws IOException {TcpEchoClient tcpEchoClient=new TcpEchoClient("127.0.0.1",9090);tcpEchoClient.start();}
}

服务器:

package TCP;import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;public class TcpEchoServer {ServerSocket socket=null;public TcpEchoServer(int port) throws IOException {socket=new ServerSocket(port);}public void start() throws IOException {System.out.println("服务器启动");while (true){Socket clientsocket= socket.accept();Thread t=new Thread(()->{processConnection(clientsocket);});t.start();}}private void processConnection(Socket clientsocket)  {//服务器启动System.out.printf("[%s:%d] 客户端上线\n",clientsocket.getInetAddress(),clientsocket.getPort());try (InputStream inputStream=clientsocket.getInputStream();OutputStream outputStream=clientsocket.getOutputStream()) {//连接请求分析while (true) {Scanner scanner = new Scanner(inputStream);if (!scanner.hasNext()) {System.out.printf("[%s:%d] 客户端下线\n", clientsocket.getInetAddress(), clientsocket.getPort());break;}String request = scanner.next();//做出响应String response = process(request);//发送给客户端PrintWriter writer = new PrintWriter(outputStream);writer.println(response);writer.flush();//打印以下交互过程System.out.printf("[%s:%d],req=%s,rep=%s\n", clientsocket.getInetAddress(), clientsocket.getPort(), request, response);}} catch (IOException e) {e.printStackTrace();}finally {try {clientsocket.close();} catch (IOException e) {e.printStackTrace();}}}private String process(String request) {return request;}public static void main(String[] args) throws IOException {TcpEchoServer tcpEchoServer=new TcpEchoServer(9090);tcpEchoServer.start();}
}

4.总结

本篇文章主要讲述了利用UDP和TCP进行网络编程,我们要掌握客户端与服务器的各个流程.

下期预告:网络原理

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/837304.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

四川易点慧电商抖音小店:优势尽显,引领电商新潮流

在当下这个信息爆炸、消费模式日新月异的时代,电商行业正在经历一场前所未有的变革。四川易点慧电商抖音小店凭借其独特的优势,成功吸引了大量消费者的目光,成为电商领域的一股新势力。 四川易点慧电商抖音小店的最大优势在于其强大的品牌影…

Vue3实战笔记(19)—封装菜单组件

文章目录 前言一、封装左侧菜单导航组件二、使用步骤三、小彩蛋总结 前言 在Vue 3中封装一个左侧导航菜单组件是一项提升项目结构清晰度和代码可复用性的关键任务。这个过程不仅涉及组件的设计与实现,还需考虑其灵活性、易用性以及与Vue 3新特性的紧密结合。以下是…

如何恢复删除的文件?收好6个恢复策略!

“我经常在操作电脑时可能会有误删文件的情况发生,如果我不小心删除了重要的文件,应该使用什么方法来恢复它们呢?求解答!” 在使用电脑时,我们可能一个手滑就误删了重要的文件。当文件删除后,如果没有掌握相…

win10安装mysql8.0+汉化

一、官网安装 MySQL 1. 在mysql官网进行下载页面 2. 下滑页面,选择 MySQL community download 3.下载windows版本 4.选择第二个download 5.不用登陆,no thanks,just start my download. 6.下载 二、安装 1. 双击安装 2. 选 Full->next 3…

depcheck检查项目中未被使用的依赖

depcheck是一个用于分析项目中依赖项的工具,可以查看:每个依赖项是如何使用的,哪些依赖项是无用的,以及哪些依赖项在package.json 1、安装 npm install -g depcheck # 必须全局安装2、可配置文件.depcheckrc(不配置 直…

开源模型应用落地-CodeQwen模型小试-集成langchain(四)

一、前言 通过学习代码专家模型,开发人员可以获得高效、准确和个性化的代码支持。这不仅可以提高工作效率,还可以在不同的技术环境中简化软件开发工作流程。代码专家模型的引入将为开发人员带来更多的机会去关注创造性的编程任务,从而推动软件…

【轮转数组】力扣python

1.python切片 这里nums[:]代表列表 class Solution:def rotate(self, nums: List[int], k: int) -> None:nlen(nums)nums[:]nums[-k%n:]nums[:-k%n] 2.边pop边push 0代表插入的位置 class Solution:def rotate(self, nums: List[int], k: int) -> None:nlen(nums)fo…

花趣短视频源码淘宝客系统全开源版带直播带货带自营商城流量主小游戏功能介绍

1、首页仿抖音短视频 ,关注 ,我的 本地 直播 可发布短视频 可录制上传 2、商城页面 广告位、淘口令识别、微信登录、淘宝登录、淘宝返佣、拼多多返佣、京东返佣、唯品会返佣、热销榜、聚划算、天猫超市、9.9包邮、品牌特卖、新人攻略 、小米有品、优惠加…

不知摄像机网段IP地址?别担心,这里有解决之道

在数字化、智能化的今天,摄像机作为安全监控和日常记录的重要工具,其应用越来越广泛。然而,在实际使用中,我们可能会遇到一些问题,比如忘记了摄像机的网段IP地址,这往往会让我们感到头疼。那么,…

LearnOpenGL(十五)之深度测试

一、深度缓冲 深度缓冲就像颜色缓冲(Color Buffer)(储存所有的片段颜色:视觉输出)一样,在每个片段中储存了信息,并且(通常)和颜色缓冲有着一样的宽度和高度。深度缓冲是由窗口系统自动创建的&a…

C++的相关知识集

1、C概述 1 两大编程思想 c语言在c语言的基础上添加了面向对象编程和泛型编程的支持。c继承了c语言高效,简洁,快速和可移植的传统。 2 起源 与c语言一样,c也是在贝尔实验室诞生的,Bjarne Stroustrup(本贾尼斯特劳斯特卢普)在2…

解决kali linux ssh连接失败

kali linux 默认ssh是禁止root登录的 为了通过 SSH 进入你的 Kali Linux 系统,你可以有两个不同的选择。第一个选择是创建一个新的非特权用户然后使用它的身份来登录。第二个选择,你可以以 root 用户访问 SSH 。为了实现这件事,需要在SSH 配…

AI早班车5.11

📢📢📢📣📣📣 哈喽!大家好,我是「奇点」,江湖人称 singularity。刚工作几年,想和大家一同进步🤝🤝 一位上进心十足的【Java ToB端大厂…

经纬恒润亮相AutoSec中国汽车网络安全及数据安全合规峰会

近日,由谈思实验室、谈思汽车、上海市车联网协会联合举办的AutoSec 8周年年会暨中国汽车网络安全及数据安全合规峰会在上海举办。本次大会主要聚焦数据合规、汽车网络与数据安全趋势与挑战、软件供应链安全、车辆网络安全、网络安全管理等话题。经纬恒润作为智能网联…

C语言 [力扣]详解环形链表和环形链表II

各位友友们,好久不见呀!又到了我们相遇的时候,每次相遇都是一种缘分。但我更加希望我的文章可以帮助到大家。下面就来具体看看今天所要讲的题目。 文章目录 1.环形链表2.环形链表II 1.环形链表 题目描述:https://leetcode.cn/problems/link…

部署Discuz论坛项目

DIscuz 是由 PHP 语言开发的一款开源社交论坛项目。运行在典型的LNMP/LAMP 环境中。 安装MySQL数据库5.7 主机名IP地址操作系统硬件配置discuz-db192.168.226.128CentOS 7-mini-20092 Core/4G Memory 修改主机名用来自己识别 hostnamectl set-hostname discuz-db #重连远程…

uniapp h5 配置代理服务器

"devServer": {"disableHostCheck": true,"proxy": {"/api": {// 需要被代理的后台地址"target": "http://自己的地址","changeOrigin": true,"secure": false,"pathRewrite": {&q…

机器学习(2)

目录 2-1泛化能力 2-2过拟合和欠拟合 2-3三大问题 2-4评估方法 2-5调参和验证集 2-6性能度量 2-7比较检验 2-1泛化能力 如何进行模型评估与选择? 2-2过拟合和欠拟合 泛化误差:在“未来”样本上的误差 经验误差:在训练集上的误差&am…

每日OJ题_贪心算法四⑧_力扣767. 重构字符串

目录 力扣767. 重构字符串 解析代码 力扣767. 重构字符串 767. 重构字符串 难度 中等 给定一个字符串 s ,检查是否能重新排布其中的字母,使得两相邻的字符不同。 返回 s 的任意可能的重新排列。若不可行,返回空字符串 "" 。 …

鸿蒙系统编译方式

鸿蒙系统编译 编译原理编译方式概述hb编译ohos-buildhb安装编译使用build脚本hpmhpm介绍编译举例说明综合应用举例虚拟机中编译docker中使用hpm编译编译原理 编译构建指导:https://docs.openharmony.cn/pages/v4.0/zh-cn/device-dev/subsystems/subsys-build-all.md,文档介绍…