JavaSE 网络编程
什么是网络编程
计算机与计算机之间通过网络进行数据传输
两种软件架构

网络编程3要素

IP
IPv4
IPv6



@Testpublic void test01() throws UnknownHostException {
// InetAddress.getByName 可以是名字或ipInetAddress address = InetAddress.getByName("LAPTOP-7IJTG2U2");System.out.println(address);String hostName = address.getHostName();System.out.println(hostName);String ip = address.getHostAddress();System.out.println(ip);}
端口号

协议
OSI参考模型

TCP/IP协议

UDP
发送数据,接收数据
代码
/*54321端口发送数据到12345端口,从12345端口取出数据*/@Testpublic void UDP_Send() throws IOException {//1.创建DatagramSocket对象(快递公司)//空参:绑定随机端口DatagramSocket ds = new DatagramSocket(54321);//2.打包数据byte[] data="测试UDP".getBytes();InetAddress address = InetAddress.getByName("LAPTOP-7IJTG2U2");int port=12345;DatagramPacket dp = new DatagramPacket(data,data.length,address,12345);//发送数据,释放资源ds.send(dp);//向名为“LAPTOP-7IJTG2U2”的计算机的12345端口发送数据ds.close();}@Testpublic void UDP_Receive() throws IOException {//创建DatagramSocket对象,绑定端口12345,因为数据被发送到12345端口DatagramSocket ds = new DatagramSocket(12345);InetAddress address = InetAddress.getByName("LAPTOP-7IJTG2U2");byte[] bytes = new byte[1024];DatagramPacket dp = new DatagramPacket(bytes,bytes.length);System.out.println("12345端口等待接收数据中");ds.receive(dp);System.out.println("12345端口接收到数据");byte[] data = dp.getData();String s = new String(data,0,dp.getLength());System.out.println("从ip:"+dp.getAddress()+"的"+dp.getPort()+"端口获取到数据:"+s);}
先运行UDP_Receive,会阻塞在ds.receive ,再运行UDP_Send发送数据
运行结果
12345端口等待接收数据中
12345端口接收到数据
从ip:/192.168.123.1的54321端口获取到数据:测试UDPProcess finished with exit code 0
UDP案例:聊天室
需求

发送(聊天室里面的人)
public class RoomSend {public static void main(String[] args) throws IOException {DatagramSocket ds = new DatagramSocket();Scanner sc = new Scanner(System.in);InetAddress address = InetAddress.getByName("127.0.0.1");int port=12345;while (true){System.out.println("请输入:");String str = sc.next();if("886".equals(str)){break;}byte[] bytes = str.getBytes();DatagramPacket dp = new DatagramPacket(bytes, bytes.length, address, port);ds.send(dp);}ds.close();}
}
接收 (聊天室)
public class RoomReceive {public static void main(String[] args) throws IOException {DatagramSocket ds = new DatagramSocket(12345);byte[] bytes = new byte[1024];DatagramPacket dp = new DatagramPacket(bytes, 0,bytes.length);while (true){ds.receive(dp);System.out.println(dp.getAddress()+"--"+dp.getPort()+"--"+new String(dp.getData(),0,dp.getLength()));}}
}
允许创建多个RoomSend

测试




TCP

发送数据,接收数据
服务端
public class Server {public static void main(String[] args) throws IOException {//1.创建ServerSocket对象ServerSocket ss = new ServerSocket(10000);//2.监听客户端的链接,没有客户端链接会一直卡在这里,有客户端连接返回socket对象Socket socket = ss.accept();//3.获取输入流,读数据int b;BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));while ((b=br.read())!=-1){System.out.print((char)b);}//4.释放资源br.close();socket.close();//ss.close(); //客户端不关闭}
}
客户端
public class Client {public static void main(String[] args) throws IOException {//1.创建socket对象,连接不到服务器的端口10000会报错Socket socket = new Socket("127.0.0.1", 10000);//2.获取socket对象的输出流,输出数据OutputStream os = socket.getOutputStream();os.write("我测".getBytes());//3.释放资源os.close();socket.close();}
}
TCP的三次握手和四次挥手
三次握手

四次挥手

练习
接收并反馈信息


上传文件
服务端
public class Server {public static void main(String[] args) throws IOException {ServerSocket ss = new ServerSocket(10000);Socket socket = ss.accept();InputStream is = socket.getInputStream();BufferedInputStream bis = new BufferedInputStream(is);BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("D:\\java_workspace\\demo3\\src\\main\\java\\com\\example\\upload\\copy.png"));int len;byte[] bytes = new byte[1024];while ((len=bis.read(bytes))!=-1){bos.write(bytes,0,len);}bos.close();bis.close();socket.close();ss.close();System.out.println("传输完成");}
}
客户端
public class Client {public static void main(String[] args) throws IOException {FileInputStream fis = new FileInputStream(new File("D:\\java_workspace\\demo3\\src\\main\\java\\com\\example\\upload\\img.png"));BufferedInputStream bis = new BufferedInputStream(fis);int len;byte[] bytes = new byte[1024];Socket socket = new Socket("127.0.0.1", 10000);OutputStream os = socket.getOutputStream();while ((len= fis.read(bytes))!=-1){os.write(bytes,0,len);}fis.close();socket.shutdownOutput();os.close();socket.close();}
}
上传文件(线程版)
服务端
public class TCPServer {public static void main(String[] args) throws IOException {ServerSocket ss = new ServerSocket(10000);while (true){Socket socket = ss.accept();new Thread(new MyRunnable(socket)).start();}}
}
public class MyRunnable implements Runnable{private Socket socket;public MyRunnable(Socket socket) {this.socket = socket;}@Overridepublic void run() {try {InputStream is = socket.getInputStream();BufferedInputStream bis = new BufferedInputStream(is);BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("D:\\java_workspace\\demo3\\src\\main\\java\\com\\example\\upload\\" + UUID.randomUUID().toString().replace("-", "") + ".png"));int len;byte[] bytes = new byte[1024];while ((len = bis.read(bytes)) != -1) {bos.write(bytes, 0, len);}bos.close();bis.close();socket.close();System.out.println("传输完成");} catch (IOException e) {e.printStackTrace();}}
}
客户端
public class TCPClient {public static void main(String[] args) throws IOException, InterruptedException {FileInputStream fis = new FileInputStream(new File("D:\\java_workspace\\demo3\\src\\main\\java\\com\\example\\upload\\img.png"));BufferedInputStream bis = new BufferedInputStream(fis);int len;byte[] bytes = new byte[1024];Socket socket = new Socket("127.0.0.1", 10000);OutputStream os = socket.getOutputStream();while ((len = fis.read(bytes)) != -1) {os.write(bytes, 0, len);}Thread.sleep(5000);fis.close();socket.shutdownOutput();os.close();socket.close();}
}
上传文件(线程池版)
服务端
public class TCPServer {private static ThreadPoolExecutor myThreadPool = new ThreadPoolExecutor(4,//核心线程数17,//最大线程数1,//空闲线程最大存活时间TimeUnit.MINUTES,//时间单位new ArrayBlockingQueue<>(2),//长度为3的等待队列Executors.defaultThreadFactory(),//创建线程工厂new ThreadPoolExecutor.AbortPolicy()//设置拒绝策略:丢弃任务并抛出异常);public static void main(String[] args) throws IOException {ServerSocket ss = new ServerSocket(10000);while (true){Socket socket = ss.accept();TCPServer.myThreadPool.submit(new MyRunnable(socket));
// new Thread(new MyRunnable(socket)).start();}}
}
客户端和MyRunnable同上
相关文章:
JavaSE 网络编程
什么是网络编程 计算机与计算机之间通过网络进行数据传输 两种软件架构 网络编程3要素 IP IPv4 IPv6 Testpublic void test01() throws UnknownHostException { // InetAddress.getByName 可以是名字或ipInetAddress address InetAddress.getByName("LAPTOP-7I…...
ubuntu24.04 编译安装PHP7.4
ubuntu24.04 编译安装PHP7.4 先安装依赖包(原本是centos上安装依赖,让chatgpt转换了下对应的ubutnu下包名,如果编译过程有缺失,按报错提示再安装下) apt install zlib1g zlib1g-dev libpcre3 libpcre3-dev libfreety…...
Tied and Anchored Stereo Attention Network for Cloud Removal in Optical
论文名称 基于固定锚定立体注意力网络的光学遥感图像去云方法代码运行 论文代码 https://github.com/ningjin00/TASANet?tabreadme-ov-file 论文地址 1环境创建 模型环境给了这几个包,如果你自带环境 那就运行代码 提示缺哪个装哪个 python 3.12rasterio 1.3.10…...
云开发微信小程序--即时聊天(单人聊天,多人聊天室)
云开发微信小程序–即时聊天 介绍:本小程序包含欢迎界面,注册,登录,一对一聊天,群聊,好友添加请求验证过程,修改好友备注以及删除好友,退出群聊,特殊角色卡片展示&#…...
Leetcod编程基础0到1-基础实现内容(个人解法)(笔记)
以下为个人解法,欢迎提供不同思路 1768. 交替合并字符串 题目:给你两个字符串 word1 和 word2 。请你从 word1 开始,通过交替添加字母来合并字符串。如果一个字符串比另一个字符串长,就将多出来的字母追加到合并后字符串的末尾&…...
仲阳天王星运维实习一面
自我介绍? 略谈谈你对“仲阳天王星”的理解? 略实习时间怎么安排,后续时间是怎么规划的? 略给你一个装满水的8升满壶和两个分别是5升、3升的空壶,请想个办法,使得其中一个水壶恰好装4升水,每一步…...
排序算法详解
💎所属专栏:数据结构与算法学习 💎 欢迎大家互三:2的n次方_ 🍁1. 插入排序 🍁1.1 直接插入排序 插入排序是一种简单直观的排序算法,它的原理是通过构建有序序列,对于未排序数…...
vxe-table树形结构使用setCheckboxRow卡顿--已解决
项目场景: vxe-table树形结构使用setCheckboxRow进行部分节点选中 问题描述 vxe-table树形结构使用setCheckboxRow,在数据较多时卡顿 原因分析: setCheckboxRow内部进行了多次的循环遍历,导致速度慢 解决方案: 设…...
配置错误和 IAM 弱点是云安全的主要隐患
根据云安全联盟发布的《2024 年云计算最大威胁》报告,通常与云服务提供商 (CSP) 相关的传统云安全问题的重要性正在持续下降。 配置错误、IAM 弱点和 API 风险仍然至关重要 这些发现延续了 2022 年报告中首次发现的轨迹,同时,诸如错误配置的…...
Redis系列之Redis Cluster
概述 Redis 2.8版本发布稳定版Redis Sentinel,不过Sentinel集群版存在一些问题: 高可用性:Sentinel集群对Redis既有的主从集群提供有限的高可用保障;在线扩容:节点下线,触发选举,选举涉及两个…...
网站证书过期导致WordPress后台无法登录问题解决,页面样式丢失
1、首先打开网站目录文件\wp-includes\functions.php,找到代码,应该就是就在在第8行。 require( ABSPATH . WPINC . /option.php ); 在下面添加以下代码,作用就是把http替换为https add_filter(script_loader_src, agnostic_script_loader…...
LeetCode刷题笔记第191题:位1的个数
LeetCode刷题笔记第191题:位1的个数 题目: 想法: 通过位运算判断二级制形式中有多少个1,代码及解释如下: class Solution:def hammingWeight(self, n: int) -> int:return sum(1 for i in range(32) if n & …...
C语言—函数栈帧
函数,一般都有返回值,函数名,参数,再下来还有什么mian函数,函数写出来就是要被调用的,上面图片上的代码,main函数和myadd函数,都要在自己的栈结构什么形成自己的栈,可以帮…...
IDEA 2022.1.4用前需知
目录 一、配置国内源 二、正确再次创建新项目方式 IDEA 2022.1.4下载地址 一、配置国内源 1、查看本地仓库地址 2、设置国内源-添加Setting.xml文件内容 3、修改目录(考虑到当前硬盘空间大小,英文目录名) 1)创建你要移动过去…...
Python数据可视化案例——折线图
目录 json介绍: Pyecharts介绍 安装pyecharts包 构建一个基础的折线图 配置全局配置项 综合案例: 使用工具对数据进行查看 : 数据处理 json介绍: json是一种轻量级的数据交互格式,采用完全独立于编程语言的文…...
Ubuntu虚拟机安装及汉化
一、安装 1.勾选典型(推荐)(T)——点击下一步 2.点击浏览找到光盘映像文件打开(此文件很重要安装好后安装包不要卸载,放在不容易被删除的地方)——点击下一步 3.将信息补充完整——点击下一步 4.点击浏览选择要将虚拟机安装在哪个路径&…...
记2024-08原生微信小程序开发
继2024.08 最近需要开发一个微信小程序的一个功能模块,但是之前在学的时候都是好几年前的东东了,然后重新快速过了一遍b站大学的教程,这篇文章就是基于教程进行的一些总结,和自己开发过程当中使用到的一些点和一些技巧什么的吧。 …...
嵌入式linux系统镜像制作day1
点击上方"蓝字"关注我们 01、前言 嵌入式设备(例如心电图检测仪,售票系统等)。尽管,嵌入式设备像那些智能手机一样,绝大多数都使用同样的硬件和软件,包括系统芯片SoC、储存、连接和多媒体接口、…...
【相机与图像】2. 相机内外参的标定的代码示例
1 摄像头内参的标定 【相机标定具体操作】 使用将要标定的摄像头,以不同的角度采集棋盘格,要保证视野内出现完整的棋盘格。采集图片数量约15张左右即可。 以11*8的棋盘格为例,具体流程如下: step 1. 设置棋盘格3D点;通…...
重启人生计划-拒绝内耗
🥳🥳🥳 茫茫人海千千万万,感谢这一刻你看到了我的文章,感谢观赏,大家好呀,我是最爱吃鱼罐头,大家可以叫鱼罐头呦~🥳🥳🥳 如果你觉得这个【重启人生…...
多模态AI应用开发实战:GPT与图像生成的集成架构与优化
1. 项目概述与核心价值最近在折腾AI图像生成和智能对话的整合应用时,发现了一个挺有意思的仓库:bubblesslayyer-cmd/Awesome-GPT-Image-2-OpenAi。这个项目名字乍一看有点长,但拆解一下就能明白它的核心——“Awesome”系列通常代表精选资源集…...
一键获取Steam游戏清单:Onekey工具让游戏管理变得如此简单
一键获取Steam游戏清单:Onekey工具让游戏管理变得如此简单 【免费下载链接】Onekey Onekey Steam Depot Manifest Downloader 项目地址: https://gitcode.com/gh_mirrors/one/Onekey 你是否曾为管理Steam游戏文件而烦恼?想备份心爱的游戏却不知从…...
DLSS Swapper终极指南:免费开源工具让游戏DLSS管理变得简单快速
DLSS Swapper终极指南:免费开源工具让游戏DLSS管理变得简单快速 【免费下载链接】dlss-swapper 项目地址: https://gitcode.com/GitHub_Trending/dl/dlss-swapper 如果你正在寻找一款能够智能管理游戏DLSS、FSR和XeSS文件的免费开源工具,那么DLS…...
VHD2VL终极指南:5分钟快速将VHDL转换为Verilog的免费工具
VHD2VL终极指南:5分钟快速将VHDL转换为Verilog的免费工具 【免费下载链接】vhd2vl 项目地址: https://gitcode.com/gh_mirrors/vh/vhd2vl 在FPGA和ASIC设计领域,VHDL转Verilog是许多工程师面临的共同挑战。手动转换不仅耗时费力,还容…...
UEFITool解析指南:三步骤掌握固件逆向分析的核心技术
UEFITool解析指南:三步骤掌握固件逆向分析的核心技术 【免费下载链接】UEFITool UEFI firmware image viewer and editor 项目地址: https://gitcode.com/gh_mirrors/ue/UEFITool UEFITool是一款功能强大的UEFI固件分析工具,能够帮助你深入探索计…...
Rulebook-AI:用规则引擎为AI智能体构建可控决策框架
1. 项目概述:一个基于规则的AI智能体框架最近在探索如何让AI智能体(Agent)的行为更可控、更符合业务逻辑时,我遇到了一个挺有意思的开源项目:botingw/rulebook-ai。乍一看这个名字,可能会觉得它又是一个试图…...
手把手带你激活Matlab2016b:Windows 64位系统下的完整许可配置指南
1. 准备工作:确保激活环境完整 在开始激活Matlab2016b之前,我们需要做好充分的准备工作。首先确认你已经按照官方流程完成了基础安装,并且安装目录下存在完整的文件结构。我遇到过不少朋友因为安装不完整导致后续激活失败的情况,所…...
三维重建下半场,拼的全是底层基建实力!
三维重建已从算法创新竞赛正式迈入基础设施比拼新阶段,主流技术路线逐步收敛,单纯算法红利见顶,行业竞争核心转向数据、算力、平台、生态等底层综合能力。当下竞争不再只比模型效果,而是聚焦四大核心基建维度:采集传感…...
ARM CoreSight SoC-400调试系统勘误解析与解决方案
1. CoreSight SoC-400调试系统深度解析在嵌入式系统开发领域,调试与跟踪技术是确保系统可靠性的关键环节。作为ARM架构下的核心调试解决方案,CoreSight SoC-400系列为开发者提供了强大的硬件支持。今天我将结合多年实战经验,深入剖析这个系统…...
ASPICE汽车软件开发标准:V模型、能力等级与核心过程实战解析
1. 项目概述:为什么我们需要ASPICE这张“汽车软件地图”如果你在汽车行业,尤其是涉及软件、电子电气或系统开发的岗位待过一阵子,大概率会频繁听到一个词:ASPICE。它可能出现在项目启动会上,出现在供应商审核清单里&am…...
