【JavaSE】网络编程

定义:在网络通信协议下,不同计算机上运行的程序,进行的数据传输

常见的软件架构:

C/S:Client/Server(客户端/服务器)

在用户本地需要下载并安装客户端程序

    1. 画面可以很精美,用户体验好
    2. 需要开发客户端,也需要开发服务端
    3. 用户需要下载和更新太麻烦

B/S:Browser/Server(浏览器/服务器)

只需要浏览器,通过不同网址访问

    1. 不需要开发客户端,只要开发服务端
    2. 用户不需要下载,打开游览器就能玩
    3. 如果应用过大,用户体验差劲

网络编程三要素

    1. IP:设备在网络中的地址,是唯一的标识
    2. 端口号:应用程序在设备中唯一的表示
    3. 协议:数据在网络中传输的规则

IPv4:全称:Internet Protocol version 4

采用32地址长度,分成四组(最多2^32不够用) 点分十进制

IPv6:Internet Protocol version 4

采用128位地址长度,分成8组(2^128) 冒分16进制

特殊IP地址:127.0.0.1 是localhost:是回送地址,也称本机ip

常用的CMD命令

ipconfig:查看本机ip地址

ping:检查网络是否联通

Static InetAddress getByname(String host) 确定主机名称的ip地址,主机名称可以是机器名称,也可以是ip地址】】

String getHostName() 获取次ip地址的主机名(局域网找不到就返回ip)

String getHostAddress() 返回文本显示的地址字符串

端口号:

由两个字节表示的整数,取值范围:0~65535

其中0~1023之间的端口号用于知名网络服务和应用

***一个端口号只能被一个应用程序使用

协议:

UDP

  • 用户数据报协议
  • UDP是面向无连接通讯协议
    • 速度快有大小限制,最多一次发送64K,数据不安全,易丢失数据

TCP

  • 传输控制协议TCP
  • TCP协议是面向连接的通讯协议
  • 速度慢,没有大小限制,数据安全

UDP

UDP发送信息:

  1. 创建发送端的DatagramSocket对象

细节:空参会随机一个端口发送

有参:指定端口绑定

  1. 数据打包(DatagramPacket)

new DatagramPacket(byte[] bytes,0,int len,InetAddress adress,int port)

address指定发送给哪个ip

port指定端口

  1. 发送数据

ds.send(dp);

  1. 释放资源

UDP接受信息:

  1. 创建DatagramSocket(port)

端口与发送端一致

  1. 接收数据包

DatagramPacket(bytes,bytes.length)

ds.receive(dp)

  1. 解析数据包
byte[] data=dp.getData();  获取数据
int len=dp.getLength();    获取长度
int port= dp.getPort();    获取端口
InetAddress address=dp.getAddress();    获取地址

UDP的三种通信方式:

  1. 单播
  2. 组播

地址:224.0.0.0~239.255.255.255

  1. 广播

TCP

TCP发送消息

1、客户端

  • 创建Socket(String host, int port)对象
  • 向服务器发送连接请求
  • 向服务器发送服务请求
  • 接受服务结果(服务响应)
  • 关闭流和Socket对象

发送数据的步骤

1、创建客户端的Socket对象(Socket)

Socket(String host, int port)

2、获取输出流,写数据

OutputStream getOutputStream()

3、释放资源

Soc创建Socket(String host, int port)对象
向服务器发送连接请求
向服务器发送服务请求
接受服务结果(服务响应)
关闭流和Socket对象ket socket=new Socket("127.0.0.1",10086);
OutputStream os=socket.getOutputStream();
OutputStreamWriter osw=new OutputStreamWriter(os);
while (true){
    String str=sc.next();
    osw.write(str);
    if(str.equals("再见")){
        break;
    }
    osw.flush();
}


osw.close();
socket.close();

2、服务端

创建ServerSocket(int port)对象

  • 在Socket上使用accept方法监听客户端的连接请求
  • 阻塞、等待连接的建立
  • 接收并处理请求信息
  • 将处理结果返回给客户端
  • 关闭流和Socket对象

1、创建服务器端的Socket对象(ServerSocket)

ServerSocket(int port)

2、获取输入流,读数据,并把数据显示在控制台

Socket accept()

3、释放资源

public static void main(String[] args) throws IOException {

    ServerSocket ss=new ServerSocket(10086);
    while (true) {
        Socket socket = ss.accept();
        InputStream is = socket.getInputStream();
        InputStreamReader ir = new InputStreamReader(is);
        int len;
        char[] chars=new char[1024];
        String str=null;
        while ((len = ir.read(chars)) != -1) {
            str=new String(chars,0,len);
            System.out.println(str);
            if(str.equals("再见")){
                break;
            }
        }
        if(str.equals("再见")){
            break;
        }
        socket.close();;

    }
    ss.close();;


}

注意

TCP IO流循环结束的的标志不是-1,开始的时候结束是因为发送端结束凿毁了socket通道

一个secokt服务端只能接受一个来源,多个来源没办法区分

Http协议一行一行是靠换行符进行区分

GET / HTTP/1.1
Host: 127.0.0.1:10086
Connection: keep-alive
sec-ch-ua: "Microsoft Edge";v="119", "Chromium";v="119", "Not?A_Brand";v="24"
sec-ch-ua-mobile: ?0
sec-ch-ua-platform: "Windows"
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36 Edg/119.0.0.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Sec-Fetch-Site: none
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6,ja;q=0.5

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【面试经典 | 150】单词拆分

文章目录 Tag题目来源解题思路方法一:动态规划 写在最后 Tag 【动态规划】【字符串】 题目来源 139. 单词拆分 解题思路 方法一:动态规划 定义状态 定义 dp[i] 表示字符串 s 前 i 个字符组成的字符串(s[0, ..., i-1])是否能被…

7.JDK下载和安装

文章目录 一、下载二、安装三、JDK的安装目录介绍 写JAVA代码不是随随便便能写的,我们得先做一点准备工作。例如,我们平时想要玩一把游戏,就需要先下载、安装才能玩游戏。JAVA也是一样的,也是需要下载并安装相关的软件&#xff0c…

2010-2021年银行网点及员工信息数据

2010-2021年银行网点及员工信息数据 1、时间:2010-2021年 2、来源:整理自csmar 3、指标:银行代码、股票代码、银行中文简称、统计截止日期、分行数量、机构网点数量、其中:境内网点数量、其中:境外网点数量、在职员…

[疑难杂症2024-002]一个“显而易见“的问题,是如何进入生产环境的?

本文由Markdown语法编辑器编辑完成。 1. 前言 最近在处理一个在医院上线的系统的问题。这个问题,由于关联的模块比较多,至少涉及到3个模块之间的功能调用。因此,协调大家都有时间来排查问题不是很方便。这个问题就拖了有一周左右。医院那边…

2024-03-28 Quest3 开发环境配置教程

文章目录 准备条件1 登录 Meta 账号2 Oculus 软件下载与配置3 下载 Quest3 开发包4 Unity 环境配置环境测试 准备条件 Quest3 头显一个。一根 USB 3.0 数据线。魔法。 ​ 有关 quest3 激活与配置可参考 B 站 UP :“南七月nqy_”。跳转链接:https://spa…

Exception in thread “main“ com.fasterxml.jackson.databind.JsonMappingException:

问题:jaskson反序列化超出最大长度 Caused by: com.fasterxml.jackson.core.exc.StreamConstraintsException: String length (5043456) exceeds the maximum length (5000000) 场景:前端传递过大base64 原因: jaskon默认已经限制了最大长…

货币系统(闫氏DP分析法)

题目描述: 给定 V 种货币(单位:元),每种货币使用的次数不限。 不同种类的货币,面值可能是相同的。 现在,要你用这 V 种货币凑出 N 元钱,请问共有多少种不同的凑法。 输入格式&am…

路由的完整使用

多页面和单页面 多页面是指超链接等跳转到另一个HTML文件,单页面是仍是这个文件只是路由改变了页面的一部分结构. 路由的基本使用 使用vue2,则配套的路由需要是第3版. 1)下载vue-router插件 2)引入导出函数 3)new 创建路由对象 4)当写到vue的router后只能写路由对象,因此只…

CImage 类及其常用成员函数用法实例详解 一

Cimage类是一个用于处理图像的类,它的主要用途是方便地创建、编辑、保存和显示图像。Cimage类支持多种图像文件格式,包括BMP、GIF、JPG、PNG和TIF等。较CBitmap类使用起来更方便。其构造函数及成员函数如下: 下面详细说明CImage常用成员函数的…

解决Animate.css动画效果无法在浏览器运行问题

背景 在开发官方网站的时候,临时更换了电脑,发现原本正常的动画效果突然不动了。 经过 chrome、Microsoft Edge都无法运行。 Animate.css | A cross-browser library of CSS animations. 问题排查 通过审查元素后发现类名是注入并且生效的。 验证 然…

【漏洞复现】企互联-FE企业运营管理平台uploadAttachmentServlet接口存在任意文件上传漏洞

漏洞描述 FE企业运营管理平台(以下简称FE6.5)是基于互联企业云工作台,以移动技术、云计算、大数据处理技术、传感技术等信息技术为支撑,和各类业务系统全面融合的移动化云平台,分为企业版和集团版,能满足各种规模企业的信息化建设需求。FE6.5以移动、平台、社交、云及大…

OpenHarmony实战开发-List组件的使用之设置项

介绍 在本篇CodeLab中,我们将使用List组件、Toggle组件以及Router接口,实现一个简单的设置页,点击将跳转到对应的详细设置页面。效果图如下: 相关概念 CustomDialog:CustomDialog装饰器用于装饰自定义弹窗。List&…

Apifox 新版发布:多分支升级、Query 参数支持枚举、自定义快捷键全面解读

看看本次版本更新主要涵盖的重点内容,有没有你所关注的功能特性: 多分支能力持续升级Query 参数支持枚举等高级配置支持自定义快捷键支持全局设置是否允许返回响应里有额外字段支持导入非 API 的 Markdown 文件更多 CI/CD 平台集成环境变量支持实时协作…

基于springboot+vue+Mysql的“智慧食堂”设计与实现

开发语言:Java框架:springbootJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:…

查找总价格为目标值的两个商品【双指针】

这道题实际上跟本专栏上一题属于同一类型&#xff0c;是上一题的简单版&#xff0c;可以点击跳跃。 ⬇ 有效三角形的个数【双指针】 法一&#xff1a;暴力求解 class Solution { public:vector<int> twoSum(vector<int> &nums, int target){int n nums.size()…

Numpy 初体验

文章目录 第1关&#xff1a;Numpy 创建数组第2关&#xff1a;Numpy 数组的基本运算第3关&#xff1a;Numpy 数组的切片与索引第4关&#xff1a;Numpy 数组的堆叠第5关&#xff1a;Numpy 的拆分 第1关&#xff1a;Numpy 创建数组 编程要求 本关的任务是&#xff0c;补全右侧编辑…

用docker在局域网虚拟一个docker虚拟机,支持单独ip,gpu,systemd,在docker里面安装docker

可以实现局域网内虚拟一台linux服务器&#xff0c;效果类似虚拟机&#xff0c;用docker实现&#xff0c;需要注意&#xff0c;这种方式和宿主机是不能通讯的&#xff0c;但是可以和局域网内的设备通讯 觉得好用可以加作者wx: lx-ivan 编写dockerfile vim Dockerfile FROM u…

飞鸟写作怎么用 #经验分享#学习方法#学习方法

飞鸟写作是一款非常好用的论文写作工具&#xff0c;它不仅能够帮助用户写作论文&#xff0c;还可以检测论文的原创性和查重率&#xff0c;是许多学生和研究人员的首选工具。 使用飞鸟写作非常方便&#xff0c;用户只需将论文复制粘贴到工具中&#xff0c;就能够快速得到论文的原…

【Hello,PyQt】控件拖拽

在 PyQt 中实现控件拖拽功能的详细介绍 拖拽功能是现代用户界面设计中常见的交互方式之一&#xff0c;它可以提高用户体验&#xff0c;增加操作的直观性。在 PyQt 中&#xff0c;我们可以很容易地实现控件之间的拖拽功能。本文将介绍如何在 PyQt 中实现控件的拖拽功能。 如何实…

初识C++ · 入门(1)

目录 前言&#xff1a; 1 命名空间 2 输入和输出 3 缺省参数 5 函数重载 前言&#xff1a; C与C语言是有一定交集的&#xff0c;可以理解为本贾尼在使用C语言的时候认为有缺陷&#xff0c;于是加了一些小语法进行改良&#xff0c;后来经过委员会的修改&#xff0c;C98问世…