d20(184-190)-勇敢开始Java,咖啡拯救人生
目录
网络通信
网络通信三要素(IP地址,端口号,协议
IP地址
InetAddress
端口号
协议
传输层的两个通信协议
UDP通信
java.net.Datagramsocket类
客户端
服务端
UDP通信多收多发
客户端
服务端
TCP通信
java.net.Socket类
客户端
服务端
TCP通信多收多发
客户端
服务端
群聊
网络通信
网络编程:可以让设备中的程序与网络上其他设备中的程序进行数据交互(实现网络通信的)
基本的通信架构有2种形式:CS架构(Client客户端/Server服务端)、BS架构(Browser浏览器/Server服务端)。


网络通信三要素(IP地址,端口号,协议

IP地址
IP(Internet Protocol):全称”互联网协议地址”,是分配给上网设备的唯一标志。
IP地址有两种形式:IPV4、IPV6



公网IP:是可以连接互联网的IP地址;
内网IP:也叫局域网IP,只能组织机构内部使用。
192.168.开头的就是常见的局域网地址,范围即为192.168.0.0--192.168.255.255,专门为组织机构内部使用
特殊IP地址
127.0.0.1、localhost:代表本机IP,只会寻找当前所在的主机。
IP常用命令
ipconfig:查看本机IP地址。
pingIP地址:检查网络是否连通
InetAddress


端口号
端口:标记正在计算机设备上运行的应用程序的,被规定为一个16 位的二进制,范围是0~65535。
分类
周知端口:0~1023,被预先定义的知名应用占用(如:HTTP占用 80,FTP占用21)
注册端口:1024~49151,分配给用户进程或某些应用程序。
动态端口:49152到65535,之所以称为动态端口,是因为它一般不固定分配某种进程,而是动态分配。
注意:我们自己开发的程序一般选择使用注册端口,且一个设备中不能出现两个程序的端口号一样,否则出错。
协议
通信协议:网络上通信的设备,事先规定的连接规则,以及传输数据的规则被称为网络通信协议

传输层的两个通信协议
UDP(User Datagram Protocol):用户数据报协议;
TCP(Transmission ControlProtocol):传输控制协议。
UDP协议
特点:无连接、不可靠通信;通信效率高
不事先建立连接,数据按照包发,一包数据包含:自己的IP、程序端口,目的地IP、程序端口和数据(限制在64KB内)等。
发送方不管对方是否在线,数据在中间丢失也不管,如果接收方收到数据也不返回确认,故是不可靠的。
TCP协议
特点:面向连接、可靠通信;通信效率相对不高哦
TCP的最终目的:要保证在不可靠的信道上实现可靠的传输,
TCP主要有三个步骤实现可靠传输:三次握手建立连接,传输数据进行确认,四次挥手断开连接
三次握手建立可靠连接
可靠连接:确定通信双方,收发消息都是正常无问题的!(全双工
传输数据会进行确认,以保证数据传输的可靠性

四次握手断开连接 确保双方数据的收发都已经完成
UDP通信
不事先建立连接:发送端每次把要发送的数据(限制在64KB内)、接收端IP、等信息封装成一个数据包,发出去就不管了
java.net.Datagramsocket类

客户端

服务端

可以获取是从哪发来的

记得最后加socket.close(); // 其实一般都不加,服务端永远不死
UDP通信多收多发
客户端

服务端

与多客户端连接,只需要客户端别指定端口号,让它默认分配,然后再启动一个客户端就行
TCP通信
通信双方事先会采用“三次握手”方式建立可靠连接,实现端到端的通信;底层能保证数据成功传给服务端。
java.net.Socket类
客户端


服务端


TCP通信多收多发
客户端

服务端

与多客户端同时通信——多线程




群聊
Client
package cn.ptz;import java.io.DataOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;public class Client {public static void main(String[] args) throws Exception {// 创建对象,请求与服务器连接Socket socket = new Socket("127.0.0.1",7777);new ClientReaderThread(socket).start();// 从socket管道得到字节输出流OutputStream os = socket.getOutputStream();// 低级输出流包装成数据输出流DataOutputStream dos = new DataOutputStream(os);Scanner sc = new Scanner(System.in);while (true){System.out.println("请输入");String msg = sc.nextLine();if ("exit".equals(msg)){System.out.println("退出");dos.close();socket.close();break;}dos.writeUTF(msg);dos.flush();}}
}
ClientReaderThread
package cn.ptz;import java.io.DataInputStream;
import java.io.InputStream;
import java.net.Socket;public class ClientReaderThread extends Thread{private Socket socket;public ClientReaderThread(Socket socket){this.socket = socket;}@Overridepublic void run() {try {InputStream is = socket.getInputStream();DataInputStream dis = new DataInputStream(is);while (true){try {String msg = dis.readUTF();System.out.println(msg);}catch (Exception e){System.out.println("客户退出" + socket.getRemoteSocketAddress());Server.onlineSockets.remove(socket);dis.close();socket.close();break;}}}catch (Exception e) {e.printStackTrace();}}
}
Server
package cn.ptz;import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;public class Server {public static List<Socket> onlineSockets = new ArrayList<>();public static void main(String[] args) throws Exception {System.out.println("服务器启动");ServerSocket serverSocket = new ServerSocket(7777);while (true){Socket socket = serverSocket.accept();onlineSockets.add(socket);System.out.println("客户端连接" + socket.getRemoteSocketAddress());new ServerReaderThread(socket).start();}}
}
ServerReaderThread
package cn.ptz;import java.io.*;
import java.net.Socket;public class ServerReaderThread extends Thread{private Socket socket;public ServerReaderThread(Socket socket){this.socket = socket;}@Overridepublic void run() {try {InputStream is = socket.getInputStream();DataInputStream dis = new DataInputStream(is);while (true){try {String msg = dis.readUTF();System.out.println(msg);sendMsgToAll(msg);}catch (Exception e){System.out.println("客户退出" + socket.getRemoteSocketAddress());Server.onlineSockets.remove(socket);dis.close();socket.close();break;}}}catch (Exception e) {e.printStackTrace();}}private void sendMsgToAll(String msg) throws IOException {for (Socket onlineSocket : Server.onlineSockets) {OutputStream os = onlineSocket.getOutputStream();DataOutputStream dos = new DataOutputStream(os);dos.writeUTF(msg);dos.flush();}}
}
BS架构

哈哈记得用线程池 不想学了 滚
相关文章:
d20(184-190)-勇敢开始Java,咖啡拯救人生
目录 网络通信 网络通信三要素(IP地址,端口号,协议 IP地址 InetAddress 端口号 协议 传输层的两个通信协议 UDP通信 java.net.Datagramsocket类 客户端 服务端 UDP通信多收多发 客户端 服务端 TCP通信 java.net.Socket类 客…...
Python 登录表单处理
分析: 处理登录表单以便爬⾍能够抓取需要认证的⽹⻚数据,通常需要模拟登录过程。这可以通过发送带有⽤⼾凭证的POST请求到登录表单的URL来实现。为了保持登录状态,需要处理和保存会话中的 cookies。Python的 requests 库可以⽅便地处理这些任…...
2024.05.27学习记录
1、面经复习: 实际工作经验章节 2、代码随想录刷题:动态规划剩下部分和单调栈 3、rosebush 组件库完成Input 和 AutoComplete部分内容...
BLASTBufferQueue端的GraphicBuffer怎么和SurfaceFlinger端的BufferStateLayer关联上
BLASTBufferQueue端的GraphicBuffer怎么和SurfaceFlinger端的BufferStateLayer关联上 引言 在跟进hwc_layer是如何产生的,并如何被填充上GraphicBuffer的,怎么也找不到被填充的GraphicBuffer的来源,最终找到了,它的来源是客户端的…...
48、spfa求最短路
spfa求最短路 题目描述 给定一个n个点m条边的有向图,图中可能存在重边和自环, 边权可能为负数。 请你求出1号点到n号点的最短距离,如果无法从1号点走到n号点,则输出impossible。 数据保证不存在负权回路。 输入格式 第一行包…...
安装PyTorch详细步骤
💥注意事项: CPU版和GPU版选一个进行安装即可 如果有Nvidia显卡,则安装cuda版本的PyTorch,如没有nvidia显卡,则安装cpu版。 目前常见的深度学习框架有很多,最出名的是:PyTorch(faceb…...
linux线程,线程控制与线程相关概念
线程概念 线程这个词或多或少大家都听过,今天我们正式的来谈一下线程; 在我一开始的概念中线程就是进程的一部分,一个进程中有很多个线程,这个想法基本是正确的,但细节部分呢我们需要细细讲解一下; 什么…...
第八大奇迹
目录 题目描述 输入描述 输出描述 输入输出样例 示例 输入 输出 运行限制 原题链接 代码思路 题目描述 在一条 R 河流域,繁衍着一个古老的名族 Z。他们世代沿河而居,也在河边发展出了璀璨的文明。 Z 族在 R 河沿岸修建了很多建筑,…...
MySQL:CRUD初阶(有图有实操)
文章目录 📑1. 数据库的操作🌤️1.1 显示当前的数据库🌤️1.2 创建数据库🌤️1.3 选中数据库🌤️1.4 删除数据库 📑2. 表的操作🌤️2.1 查看表结构🌤️2.2 创建表🌤️2.3…...
『大模型笔记』使用 vLLM 和 PagedAttention 快速提供 LLM 服务!
使用 vLLM 和 PagedAttention 快速提供 LLM 服务! 文章目录 一. 使用 vLLM 和 PagedAttention 快速提供 LLM 服务!1.1. PagedAttention二. 参考文献小红书中文字幕视频:https://www.xiaohongshu.com/explore/66502b60000000000500433e官网文档(推荐,里面有动图解释):vLLM:…...
简述vue-loader是什么?使用它的用途有哪些
vue-loader是一个webpack的加载器(loader),主要用于将Vue组件的单文件(.vue文件)转换为JavaScript模块。使用vue-loader的主要用途包括: 解析.vue文件:vue-loader能够解析.vue文件中的模板、样式和脚本,并将它们分离出来进行处理…...
如何远程访问Redis?
远程访问Redis是一种常见的需求,特别是在分布式系统或跨地域网络中。通过远程访问,我们可以轻松地对远程的Redis数据库进行操作和管理。 天联保障数据安全 对于远程访问Redis的安全性问题,我们可以借助天联来保障数据的安全。天联是一种基于…...
#12松桑前端后花园周刊-SolidStart、Vercel融资、Angular18、Nextjs15RC、p5.js、ChromeDevTools引入AI
⚡️行业动态 SolidStart 1.0 元框架发布 Solidjs 核心团队发布其元框架 SolidStart 1.0 正式版,其特点如下:基于文件系统的路由;支持SSR、流式SSR、CSR、SSG渲染模式;通过代码分割、树摇和无用代码删除构建优化;基于…...
vue3 vite title 页面标题设置
效果图: 1. 安装 vite-plugin-html 插件 npm install vite-plugin-html -D2. 修改 vite.config.js import {defineConfig, loadEnv} from vite import { createHtmlPlugin } from "vite-plugin-html" import {resolve} from path import vue from vitej…...
spring boot添加License(软件许可)
文章目录 前言1. 生成钥匙库2. 生成证书3. 生成公匙库4.业务代码1. 引入依赖2. 关键代码3. 配置文件 5、改成线上地址,这样不用每次打包,发送license.lic文件给客户,重启项目就行5.1、工具类5.2 修改部分: 总结 前言 工作需要给软…...
LangChain打造一个AI客服
最近在学习LangChain,langchain的第一个入门应用就是和ChatGPT结合形成的一个AI客服,本期文章就带大家一起认识下 LangChain LangChain是现在用得最多的AI框架,langchain在帮助如基于文档数据的回答、聊天机器人和代理这类的应用程序 langch…...
【前端三剑客之JS】详解JS
1. JS的引入方式 (1). 内部脚本方式引入 在页面上,通过一对script标签引入js代码.script代码放置位置有一定随意性,一般放在head标签中. (2).外部脚本方式引入. 内部脚本只能在当前页面中使用,代码复用度不高.可以将脚本放在单独的js文件…...
重庆耶非凡科技有限公司有选品师项目培训吗?
在当今科技飞速发展的时代,各种科技公司如雨后春笋般涌现,它们在不同领域发挥着重要作用。其中,重庆耶非凡科技有限公司以其独特的业务模式和专业服务,在业界赢得了良好的口碑。那么,重庆耶非凡科技有限公司究竟是做什…...
格式转化——Labelme标注好的json文件批量转为png(标签)文件(物体为红色,背景为黑色)和jpg原图
作用如题目,批量将标注好的json文件转成png标签,jpg原图,其中标签时红黑图。 代码如下: import argparse import base64 import json import os import os.path as osp import imgviz import PIL.Image import yaml from labelm…...
力扣刷题--2535. 数组元素和与数字和的绝对差【简单】
题目描述 给你一个正整数数组 nums 。 元素和 是 nums 中的所有元素相加求和。 数字和 是 nums 中每一个元素的每一数位(重复数位需多次求和)相加求和。 返回 元素和 与 数字和 的绝对差。 注意:两个整数 x 和 y 的绝对差定义为 |x - y| 。…...
CS231n实战解析:从HOG/HSV特征到图像分类性能提升
1. 图像特征工程入门:为什么HOG和HSV如此重要 第一次接触CS231n作业时,我对HOG和HSV这两个特征提取方法感到既陌生又好奇。直到在CIFAR-10数据集上做了对比实验才发现,使用原始像素训练的模型准确率只有0.51,而加入特征工程后直接…...
别再死磕手册了!用Vivado 2023.1手把手教你配置Aurora 64B/66B IP核(附完整复位时序图)
Vivado 2023.1实战:Aurora 64B/66B IP核配置全流程解析 在FPGA高速通信领域,Aurora协议凭借其轻量级、高带宽的特性成为众多工程师的首选。但对于初学者而言,官方文档PG074中复杂的复位时序和参数配置往往让人望而生畏。本文将基于Vivado 202…...
Wan2.2-I2V-A14B私有部署实战教程:RTX 4090D一键生成1080P视频
Wan2.2-I2V-A14B私有部署实战教程:RTX 4090D一键生成1080P视频 1. 开篇:为什么选择私有部署 当你需要频繁生成高质量视频内容时,公有云服务往往面临三个痛点:生成排队时间长、隐私数据风险、调用成本高。Wan2.2-I2V-A14B私有部署…...
金融保险会议室怎么打造?数据安全+高效协作会议系统标杆
金融保险机构的会议室不仅是协作空间,更是数据安全与合规管控的核心场景。面对战略研讨、风控决策、客户洽谈等高密会议需求,传统会议系统已难以兼顾 “高清协作、智能提效、数据不外泄” 三大核心诉求。思科视频会议 思必驰音频 离线转写主机的组合方…...
5秒破解百度网盘提取码:baidupankey智能工具如何重塑你的资源获取体验
5秒破解百度网盘提取码:baidupankey智能工具如何重塑你的资源获取体验 【免费下载链接】baidupankey 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 你是否曾为百度网盘加密资源而烦恼?面对"请输入提取码"的提示却束手无策…...
【RT-DETR涨点改进】SCI一区 2025顶刊 |全网独家创新,注意力改进篇 | RT-DETR引入DOAM动态全向注意力模块,模块,显著增强了特征表达能力和结构恢复能力,含7种独家创新改进点
一、本文介绍 🔥本文给大家介绍利用 DOAM 动态全向注意力模块改进RT-DETR网络模型,可在不显著增加计算量的前提下增强全局上下文建模能力,通过空间轴向聚合获得更强的跨区域信息交互,并用通道动态加权突出目标相关特征、抑制背景干扰,从而优化多尺度特征融合效果,提升小…...
开源大模型效果展示:Pixel Language Portal对emoji+文字混合输入的语义解析
开源大模型效果展示:Pixel Language Portal对emoji文字混合输入的语义解析 1. 项目概览 Pixel Language Portal(像素语言跨维传送门)是一款基于Tencent Hunyuan-MT-7B大模型构建的创新翻译工具。与传统翻译软件不同,它将语言转换…...
别只埋头改Bug!从Flutter高德地图鸿蒙适配,聊聊跨平台插件架构设计的最佳实践
从Flutter高德地图鸿蒙适配看跨平台插件架构设计的黄金法则 当Flutter遇上鸿蒙,开发者们既兴奋又忐忑。兴奋的是跨平台开发框架与国产操作系统的强强联合,忐忑的是两者结合带来的技术适配挑战。去年我们团队在将高德地图SDK集成到Flutter鸿蒙应用时&…...
像素剧本圣殿详细步骤:Qwen2.5-14B-Instruct模型服务健康检查与自动扩缩容配置
像素剧本圣殿详细步骤:Qwen2.5-14B-Instruct模型服务健康检查与自动扩缩容配置 1. 项目概述 像素剧本圣殿(Pixel Script Temple)是基于Qwen2.5-14B-Instruct大模型深度微调的专业剧本创作工具。该系统采用复古未来像素风格UI设计࿰…...
Java虚拟线程调试黄金组合:jstack -l + jcmd VM.native_memory + JMC Thread Group视图(生产环境零侵入诊断法)
第一章:Java虚拟线程调试黄金组合:jstack -l jcmd VM.native_memory JMC Thread Group视图(生产环境零侵入诊断法)虚拟线程(Virtual Threads)作为 Project Loom 的核心特性,在高并发场景下显著…...
