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点;通…...
重启人生计划-拒绝内耗
🥳🥳🥳 茫茫人海千千万万,感谢这一刻你看到了我的文章,感谢观赏,大家好呀,我是最爱吃鱼罐头,大家可以叫鱼罐头呦~🥳🥳🥳 如果你觉得这个【重启人生…...
多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度
一、引言:多云环境的技术复杂性本质 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时,基础设施的技术债呈现指数级积累。网络连接、身份认证、成本管理这三大核心挑战相互嵌套:跨云网络构建数据…...
大数据学习栈记——Neo4j的安装与使用
本文介绍图数据库Neofj的安装与使用,操作系统:Ubuntu24.04,Neofj版本:2025.04.0。 Apt安装 Neofj可以进行官网安装:Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...
OpenLayers 可视化之热力图
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 热力图(Heatmap)又叫热点图,是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...
【kafka】Golang实现分布式Masscan任务调度系统
要求: 输出两个程序,一个命令行程序(命令行参数用flag)和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽,然后将消息推送到kafka里面。 服务端程序: 从kafka消费者接收…...
label-studio的使用教程(导入本地路径)
文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...
day52 ResNet18 CBAM
在深度学习的旅程中,我们不断探索如何提升模型的性能。今天,我将分享我在 ResNet18 模型中插入 CBAM(Convolutional Block Attention Module)模块,并采用分阶段微调策略的实践过程。通过这个过程,我不仅提升…...
uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖
在前面的练习中,每个页面需要使用ref,onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入,需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...
大数据零基础学习day1之环境准备和大数据初步理解
学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 (1)设置网关 打开VMware虚拟机,点击编辑…...
学校招生小程序源码介绍
基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码,专为学校招生场景量身打造,功能实用且操作便捷。 从技术架构来看,ThinkPHP提供稳定可靠的后台服务,FastAdmin加速开发流程,UniApp则保障小程序在多端有良好的兼…...
工程地质软件市场:发展现状、趋势与策略建议
一、引言 在工程建设领域,准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具,正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...
