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

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,咖啡拯救人生

目录 网络通信 网络通信三要素&#xff08;IP地址&#xff0c;端口号&#xff0c;协议 IP地址 InetAddress 端口号 协议 传输层的两个通信协议 UDP通信 java.net.Datagramsocket类 客户端 服务端 UDP通信多收多发 客户端 服务端 TCP通信 java.net.Socket类 客…...

Python 登录表单处理

分析&#xff1a; 处理登录表单以便爬⾍能够抓取需要认证的⽹⻚数据&#xff0c;通常需要模拟登录过程。这可以通过发送带有⽤⼾凭证的POST请求到登录表单的URL来实现。为了保持登录状态&#xff0c;需要处理和保存会话中的 cookies。Python的 requests 库可以⽅便地处理这些任…...

2024.05.27学习记录

1、面经复习&#xff1a; 实际工作经验章节 2、代码随想录刷题&#xff1a;动态规划剩下部分和单调栈 3、rosebush 组件库完成Input 和 AutoComplete部分内容...

BLASTBufferQueue端的GraphicBuffer怎么和SurfaceFlinger端的BufferStateLayer关联上

BLASTBufferQueue端的GraphicBuffer怎么和SurfaceFlinger端的BufferStateLayer关联上 引言 在跟进hwc_layer是如何产生的&#xff0c;并如何被填充上GraphicBuffer的&#xff0c;怎么也找不到被填充的GraphicBuffer的来源&#xff0c;最终找到了&#xff0c;它的来源是客户端的…...

48、spfa求最短路

spfa求最短路 题目描述 给定一个n个点m条边的有向图&#xff0c;图中可能存在重边和自环&#xff0c; 边权可能为负数。 请你求出1号点到n号点的最短距离&#xff0c;如果无法从1号点走到n号点&#xff0c;则输出impossible。 数据保证不存在负权回路。 输入格式 第一行包…...

安装PyTorch详细步骤

&#x1f4a5;注意事项&#xff1a; CPU版和GPU版选一个进行安装即可 如果有Nvidia显卡&#xff0c;则安装cuda版本的PyTorch&#xff0c;如没有nvidia显卡&#xff0c;则安装cpu版。 目前常见的深度学习框架有很多&#xff0c;最出名的是&#xff1a;PyTorch&#xff08;faceb…...

linux线程,线程控制与线程相关概念

线程概念 线程这个词或多或少大家都听过&#xff0c;今天我们正式的来谈一下线程&#xff1b; 在我一开始的概念中线程就是进程的一部分&#xff0c;一个进程中有很多个线程&#xff0c;这个想法基本是正确的&#xff0c;但细节部分呢我们需要细细讲解一下&#xff1b; 什么…...

第八大奇迹

目录 题目描述 输入描述 输出描述 输入输出样例 示例 输入 输出 运行限制 原题链接 代码思路 题目描述 在一条 R 河流域&#xff0c;繁衍着一个古老的名族 Z。他们世代沿河而居&#xff0c;也在河边发展出了璀璨的文明。 Z 族在 R 河沿岸修建了很多建筑&#xff0c…...

MySQL:CRUD初阶(有图有实操)

文章目录 &#x1f4d1;1. 数据库的操作&#x1f324;️1.1 显示当前的数据库&#x1f324;️1.2 创建数据库&#x1f324;️1.3 选中数据库&#x1f324;️1.4 删除数据库 &#x1f4d1;2. 表的操作&#x1f324;️2.1 查看表结构&#x1f324;️2.2 创建表&#x1f324;️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)&#xff0c;主要用于将Vue组件的单文件(.vue文件)转换为JavaScript模块。使用vue-loader的主要用途包括&#xff1a; 解析.vue文件&#xff1a;vue-loader能够解析.vue文件中的模板、样式和脚本&#xff0c;并将它们分离出来进行处理…...

如何远程访问Redis?

远程访问Redis是一种常见的需求&#xff0c;特别是在分布式系统或跨地域网络中。通过远程访问&#xff0c;我们可以轻松地对远程的Redis数据库进行操作和管理。 天联保障数据安全 对于远程访问Redis的安全性问题&#xff0c;我们可以借助天联来保障数据的安全。天联是一种基于…...

#12松桑前端后花园周刊-SolidStart、Vercel融资、Angular18、Nextjs15RC、p5.js、ChromeDevTools引入AI

⚡️行业动态 SolidStart 1.0 元框架发布 Solidjs 核心团队发布其元框架 SolidStart 1.0 正式版&#xff0c;其特点如下&#xff1a;基于文件系统的路由&#xff1b;支持SSR、流式SSR、CSR、SSG渲染模式&#xff1b;通过代码分割、树摇和无用代码删除构建优化&#xff1b;基于…...

vue3 vite title 页面标题设置

效果图&#xff1a; 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、改成线上地址&#xff0c;这样不用每次打包&#xff0c;发送license.lic文件给客户&#xff0c;重启项目就行5.1、工具类5.2 修改部分&#xff1a; 总结 前言 工作需要给软…...

LangChain打造一个AI客服

最近在学习LangChain&#xff0c;langchain的第一个入门应用就是和ChatGPT结合形成的一个AI客服&#xff0c;本期文章就带大家一起认识下 LangChain LangChain是现在用得最多的AI框架&#xff0c;langchain在帮助如基于文档数据的回答、聊天机器人和代理这类的应用程序 langch…...

【前端三剑客之JS】详解JS

1. JS的引入方式 (1). 内部脚本方式引入 在页面上&#xff0c;通过一对script标签引入js代码.script代码放置位置有一定随意性&#xff0c;一般放在head标签中. (2).外部脚本方式引入. 内部脚本只能在当前页面中使用&#xff0c;代码复用度不高.可以将脚本放在单独的js文件…...

重庆耶非凡科技有限公司有选品师项目培训吗?

在当今科技飞速发展的时代&#xff0c;各种科技公司如雨后春笋般涌现&#xff0c;它们在不同领域发挥着重要作用。其中&#xff0c;重庆耶非凡科技有限公司以其独特的业务模式和专业服务&#xff0c;在业界赢得了良好的口碑。那么&#xff0c;重庆耶非凡科技有限公司究竟是做什…...

格式转化——Labelme标注好的json文件批量转为png(标签)文件(物体为红色,背景为黑色)和jpg原图

作用如题目&#xff0c;批量将标注好的json文件转成png标签&#xff0c;jpg原图&#xff0c;其中标签时红黑图。 代码如下&#xff1a; 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 中每一个元素的每一数位&#xff08;重复数位需多次求和&#xff09;相加求和。 返回 元素和 与 数字和 的绝对差。 注意&#xff1a;两个整数 x 和 y 的绝对差定义为 |x - y| 。…...

Alberta Wells数据集:从213,000个井位到全球环境监测,计算机视觉如何重塑油气设施追踪

1. 油气井监测的全球挑战与环境意义 想象一下&#xff0c;你正站在加拿大阿尔伯塔省广袤的草原上&#xff0c;脚下可能就隐藏着数十个被遗忘的油气井。这些钢铁结构的"时间胶囊"有的已经沉寂数十年&#xff0c;却仍在持续释放比二氧化碳强效84倍的甲烷气体。这就是全…...

Qwen3.5-2B多场景案例:法律文书图识别+法条关联+类案推荐三合一系统

Qwen3.5-2B多场景案例&#xff1a;法律文书图识别法条关联类案推荐三合一系统 1. 轻量化多模态模型介绍 Qwen3.5-2B是Qwen3.5系列中的轻量化版本&#xff0c;仅有20亿参数规模&#xff0c;专为低功耗、低门槛部署场景设计。这款模型特别适合部署在端侧和边缘设备上&#xff0…...

Jetson平台高温警告静默指南:深入解析notify_disable与nvpmodel_indicator.py

1. 为什么需要关闭Jetson的高温警告 当你把Jetson设备用在嵌入式系统或者工业自动化场景时&#xff0c;那个频繁弹出的"Caution - Hot surface. Do not touch"警告可能会让人抓狂。我去年在一个智能监控项目上就遇到过这种情况——设备在户外机箱里持续运行&#xff…...

CORS跨域问题终极指南:从XMLHttpRequest到Nginx代理的完整解决方案

CORS跨域问题终极指南&#xff1a;从XMLHttpRequest到Nginx代理的完整解决方案 第一次在控制台看到那个鲜红的CORS错误时&#xff0c;我正为一个紧急项目赶工。凌晨三点的咖啡已经凉了&#xff0c;而浏览器的报错信息像一堵墙横在我和 deadline 之间。相信每个全栈开发者都经历…...

Python到Android的终极桥梁:如何用python-for-android将Python应用无缝转换为原生APK

Python到Android的终极桥梁&#xff1a;如何用python-for-android将Python应用无缝转换为原生APK 【免费下载链接】python-for-android Turn your Python application into an Android APK 项目地址: https://gitcode.com/gh_mirrors/py/python-for-android 在移动应用开…...

TFT Overlay:云顶之弈玩家的终极装备合成与羁绊指南

TFT Overlay&#xff1a;云顶之弈玩家的终极装备合成与羁绊指南 【免费下载链接】TFT-Overlay Overlay for Teamfight Tactics 项目地址: https://gitcode.com/gh_mirrors/tf/TFT-Overlay 在云顶之弈的激烈对局中&#xff0c;你是否经常为记不住复杂的装备合成公式而烦恼…...

5分钟上手MouseClick:让重复点击自动化的3个核心技巧

5分钟上手MouseClick&#xff1a;让重复点击自动化的3个核心技巧 【免费下载链接】MouseClick &#x1f5b1;️ MouseClick &#x1f5b1;️ 是一款功能强大的鼠标连点器和管理工具&#xff0c;采用 QT Widget 开发 &#xff0c;具备跨平台兼容性 。软件界面美观 &#xff0c;操…...

CoPaw持续学习(Continual Learning)实践:让模型记住新知识而不遗忘

CoPaw持续学习&#xff08;Continual Learning&#xff09;实践&#xff1a;让模型记住新知识而不遗忘 1. 为什么需要持续学习&#xff1f; 想象一下&#xff0c;你教会了一只小狗坐下和握手的指令。但当你开始教它新的技能"装死"时&#xff0c;它却完全忘记了之前…...

告别手动逐个校验,用快马快速构建vmware密钥批量验证工具提升效率

告别手动逐个校验&#xff0c;用快马快速构建vmware密钥批量验证工具提升效率 最近在帮朋友处理一批VMware16的密钥验证工作&#xff0c;发现手动逐个检查不仅耗时耗力&#xff0c;还容易出错。特别是当需要验证几十甚至上百个密钥时&#xff0c;这种重复劳动简直让人崩溃。于…...

Docker测试学习思路

Docker 核心概念学习与实战指南本文系统梳理 Docker 学习的核心思路与方法&#xff0c;用通俗类比帮助理解 Docker 的本质&#xff0c;涵盖镜像构建、容器运行、网络通信、数据持久化、资源限制五大核心能力&#xff0c;适合初学者建立清晰的 Docker 知识框架。一、Docker 到底…...