Java基础_网络编程

Java基础_网络编程

  • 网络编程三要素
    • InetAddress
    • 网络模型
  • UDP通信程序
    • 单播
      • 发送数据
      • 接收数据
      • 聊天室
    • 组播
    • 广播
  • TCP
    • TCP通信程序
    • 三次握手和四次挥手
  • 来源
  • Gitee地址

网络编程三要素

  • IP: 设备在网络中的地址,是唯一的标识
  • 端口号: 应用程序在设备中唯一的标识。
  • 协议: 数据在网络中传输的规则,常见的协议有UDP、TCP、http、https、ftp。

InetAddress

public class demo {public static void main(String[] args) throws UnknownHostException {/*** static InetAddress getByName(String host)  确定主机名称的IP地址。主机名称可以是机器名称,也可以是IP地址* String getHostName()                       获取此IP地址的主机名* String getHostAddress()                    返回文本显示中的IP地址字符串*/// 1. 获取InetAddress的对象InetAddress address = InetAddress.getByName("cen");System.out.println(address);String hostName = address.getHostName();System.out.println(hostName); // cenString hostAddress = address.getHostAddress();System.out.println(hostAddress); // 192.168.174.1}
}

网络模型

  • OSI参考模型:世界互联协议标准,全球通信规范,单模型过于理想化,未能在因特网上进行广泛推
  • TCP/IP参考模型(或TCP/IP协议):事实上的国际标准。

在这里入图片描述

UDP通信程序

单播

发送数据

public class Demo {public static void main(String[] args) throws IOException {/*** udp发送数据*/// 1. 创建DatagramSocket对象// 绑定发送端口// 空参: 所有可用端口中随机一个进行使用// 有参: 指定端口DatagramSocket ds = new DatagramSocket();// 2. 打包数据String str = "Hello Socket!";byte[] bytes = str.getBytes();InetAddress address = InetAddress.getByName("127.0.0.1");int port = 10086;DatagramPacket dp = new DatagramPacket(bytes, bytes.length, address, port);// 3. 发送数据ds.send(dp);// 4. 释放资源ds.close();}
}

接收数据

public class ReceiveDemo {public static void main(String[] args) throws IOException {/*** udp接收数据*/// 1. 创建DatagramSocket对象// 接收时要绑定端口DatagramSocket ds = new DatagramSocket(10086);// 2. 接收数据byte[] bytes = new byte[1024];DatagramPacket dp = new DatagramPacket(bytes, bytes.length);ds.receive(dp);// 3. 解析数据byte[] data = dp.getData();int len = dp.getLength();InetAddress address = dp.getAddress();int port = dp.getPort();System.out.println("接收到数据: " + new String(data, 0, len));System.out.println("该数据是从" + address + "的" + port + "端口发出的");// 4. 释放资源ds.close();}
}

聊天室

// SendDemo
public class SendDemo {public static void main(String[] args) throws IOException {/*** udp循环发送数据, 直到输入886, 停止发送*/DatagramSocket ds = new DatagramSocket();Scanner sc = new Scanner(System.in);// 循环发送数据while(true) {String str = sc.nextLine();if(str.equals("886")){break;}byte[] bytes = str.getBytes();InetAddress address = InetAddress.getByName("127.0.0.1");int port = 10086;DatagramPacket dp = new DatagramPacket(bytes, bytes.length, address, port);ds.send(dp);}ds.close();}
}// ReceiveDemo
public class ReceiveDemo {public static void main(String[] args) throws IOException {/*** udp循环接收数据*/DatagramSocket ds = new DatagramSocket(10086);while(true) {byte[] bytes = new byte[1024];DatagramPacket dp = new DatagramPacket(bytes, bytes.length);ds.receive(dp);byte[] data = dp.getData();int len = dp.getLength();InetAddress address = dp.getAddress();int port = dp.getPort();System.out.println("接收到数据: " + new String(data, 0, len));System.out.println("该数据是从" + address + "的" + port + "端口发出的");}}
}

组播

  • 组播地址: 224.0.0.0 ~ 239.255.255.255, 其中224.0.0.0 ~ 224.0.0.255为预留的组播地址
// Send
public class SendDemo {public static void main(String[] args) throws IOException {/*** 组播发送*/// 1. 创建MulticastSocket对象MulticastSocket ms = new MulticastSocket();// 2. 创建DatagramPacket对象String str = "Hello MultiSocket!";byte[] bytes = str.getBytes();InetAddress address = InetAddress.getByName("224.0.0.1");int port = 10000;DatagramPacket dp = new DatagramPacket(bytes, bytes.length, address, port);// 3. 发送数据ms.send(dp);// 4. 释放资源ms.close();}
}// Receive
public class ReveiveDemo1 {public static void main(String[] args) throws IOException {MulticastSocket ms = new MulticastSocket(10000);// 将当前本机添加到 224.0.0.1InetAddress address = InetAddress.getByName("224.0.0.1");ms.joinGroup(address);// 2. 接收数据byte[] bytes = new byte[1024];DatagramPacket dp = new DatagramPacket(bytes, bytes.length);ms.receive(dp);// 3. 解析数据byte[] data = dp.getData();int len = dp.getLength();String ip = dp.getAddress().getHostAddress();String name = dp.getAddress().getHostName();System.out.println("接收到数据: " + new String(data, 0, len));System.out.println("该数据是从" + name + "/" + ip + "发出的");// 4. 释放资源ms.close();}
}

广播

将单播程序发送的ip地址改为255.255.255.255就是广播

TCP

TCP通信程序

// Client
public class ClientDemo {public static void main(String[] args) throws IOException {/*** tcp发送数据*/// 1. 创建Socket对象// 创建对象的同时会连接服务端, 如果连接不是, 代码会报错Socket socket = new Socket("127.0.0.1", 10000);// 2. 可以从连接通道中获取输出流OutputStream os = socket.getOutputStream();// 写出数据os.write("Hello TCP连接!".getBytes());// 3. 释放资源os.close();socket.close();}
}// Server
public class ServerDemo {public static void main(String[] args) throws IOException {/*** tcp接收数据*/// 1. 创建ServerSocket对象ServerSocket ss = new ServerSocket(10000);// 2. 监听客户端的连接Socket socket = ss.accept();// 3. 从连接通道中获取输入流读取数据InputStream is = socket.getInputStream();InputStreamReader isr = new InputStreamReader(is);BufferedReader br = new BufferedReader(isr);int b;while( (b = br.read()) != -1 ){System.out.print((char) b);}// 4. 释放资源socket.close();ss.close();}
}
  • 中文乱码: 将字节流通过转换流转换成字符流
  • 提高效率: 转成缓冲流
  • 输入输出流可以无需手动关闭, 因为流是在连接通道里的, 连接断开后, 流也就关闭了
  • 连接关闭时的协议: 四次挥手, 利用四次挥手协议断开连接, 可以保证连接连接通道里的数据已经处理完毕了.

三次握手和四次挥手

  • 三次握手 - 确保连接建立
    1. 客户端向服务器发出连接请求, 等待服务器确认
    2. 服务器向客户端返回一个响应, 告知客户端收到了请求
    3. 客户端向服务器再次发出确认信息, 连接建立
  • 四次挥手 - 确保连接断开, 且数据处理完毕
    1. 客户端向服务器发出取消连接请求
    2. 服务器向客户端返回一个响应, 表示收到客户端取消请求
    3. 服务器将最后的数据处理完毕后, 服务器向客户端发出确认取消信息
    4. 客户端再次发送确认消息, 连接取消

来源

黑马程序员. 阿玮Java零基础

Gitee地址

https://gitee.com/yu-ba-ba-ba/awJava

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Qt】利用Tool Button控件创建下拉菜单按钮

功能描述 利用qt进行界面设计和开发,创建下拉按钮。 详细实现 1、在qt侧工具栏利用设计打开.ui文件 2、创建按钮 创建一个Tool Button按钮,并在属性窗口中的QToolButton栏中选中MenuButtonPopup属性。 3、创建action 在Action编辑器创建对应的ac…

SQL编译优化原理

最近在团队的OLAP引擎上做了一些SQL编译优化的工作,整理到了语雀上,也顺便发在博客上了。SQL编译优化理论并不复杂,只需要掌握一些关系代数的基础就比较好理解;比较困难的在于reorder算法部分。 文章目录 基础概念关系代数等价 j…

k8s webhook实例,java springboot程序实现 对Pod创建请求添加边车容器 ,模拟istio实现日志文件清理

k8s webhook实例,java springboot程序实现 对Pod创建请求添加边车容器 ,模拟istio实现日志文件清理 大纲 背景与原理实现流程开发部署my-docker-demo-sp-user服务模拟业务项目开发部署my-sidecar服务模拟边车程序开发部署服务my-docker-demo-k8s-opera…

零拷贝原来这么简单!

我们总会在各种地方看到零拷贝,那零拷贝到底是个什么东西。 接下来,让我们来理一理啊。 拷贝说的是计算机里的 I/O 操作,也就是数据的读写操作。计算机可是一个复杂的家伙,包括软件和硬件两大部分,软件主要指操作系统…

uniapp h5 竖向的swiper内嵌视频实现抖音短视频垂直切换,丝滑切换视频效果,无限数据加载不卡顿

一、项目背景:实现仿抖音短视频全屏视频播放、点赞、评论、上下切换视频、视频播放暂停、分页加载、上拉加载下一页、下拉加载上一页等功能。。。 二、前言:博主一开始一直想实现类似抖音进入页面自动播放当前视频,上下滑动切换之后播放当前…

excel要如何自动累加某个单元格上方的所有单元格?

输入公式 SUM(INDIRECT("A1:A"&ROW()-1)) 运行实例如下图 注意图中b4,和b5单元格都输入相同的公式。 此方法可以避免写vba,以前此类问题的解决都是通过vba代码进行处理 对函数进行解析 主要使用了 INDIRECT() 2、公式说明:…

Leetcode | Binary search | 22. 74. 162. 33. 34. 153.

22. Generate Parentheses 要意识到只要还有左括号,就可以放到path里。只要右括号数量小于左括号,也可以放进去。就是valid的组合。recurse两次 74. Search a 2D Matrix 看成sorted list就好。直接用m*n表示最后一位的index,并且每次只需要 …

打印Winform控件实现简陋版的分页打印(C#)

本文的代码可以从这里获取:winformDemo.rar 张祥裕/分享的资源名称 - Gitee.com 作者的水平有限,如有错误,望指正。 为了简单起见,纸张大小,打印机等信息按照默认的来,本文的实现方案是:打印Pa…

C语言:反转一个单链表

Lei宝啊:个人主页 题目: 描述: 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。 接口: struct ListNode* reverseList(struct ListNode* head){} 示例: 输入: head [1…

全局ip代理安全吗? 手机设置全局代理方法详解

全局IP代理并不一定是安全的,因为全局IP代理会将所有网络流量都通过代理服务器进行转发,包括敏感信息和隐私数据。如果代理服务器受到黑客攻击或存在安全漏洞,可能会导致数据泄露和其他安全问题。因此,在使用全局IP代理时&#xf…

Spring Boot项目的创建

hi 大家好,又见面了,今天继续讲解Spring Boot 文章目录 🐶1.什么是Spring Boot?🐶2.Spring Boot的优势🐶3.Spring Boot项目创建🌼3.1使用ieda创建🥝3.1.1下载插件Spring Boot Helper🥝3.1.2创建项目 &…

VS创建wsdl服务提供给java调用

文章目录 前言1.c#创建asp.net web服务1.1 创建ASP.NET Web应用程序1.2 添加服务类1.3 定义服务方法1.3 浏览服务1.4 发布服务1.5 IIS部署服务 2.Java中调用服务2.1 用动态客户端工厂类调用2.1.1 引入依赖2.1.2 调用测试代码2.1.3 测试结果 2.2 创建代理类进行调用2.2.1 使用ws…

修改整数(有点坑,所以发出来了)

问题描述 小贝给了小聪一个正整数 x,但是小聪决定把这个数改掉。她可以把整数 x 每个位置上的数 t 改成 9-t。 请你帮助小聪来计算一下,如何把 x 改成一个最小的正整数,注意,不能出现首位为 0 的情况。 输入格式 输入一个正整数…

ChatGLM-6B 部署与 P-Tuning 微调实战-使用Pycharm实战

国产大模型ChatGLM-6B微调部署入门-使用Pycharm实战 1.ChatGLM模型介绍 ChatGLM-6B 是一个开源的、支持中英双语的对话语言模型,基于 General Language Model (GLM) 架构,具有 62 亿参数。结合模型量化技术,用户可以在消费级的显卡上进行本…

《吐血整理》进阶系列教程-拿捏Fiddler抓包教程(14)-Fiddler断点(breakpoints)实战,篡改或伪造数据

1.简介 上一篇主要就讲解和分享Fiddler断点的理论和操作,今天宏哥就用具体例子,将上一篇中的理论知识实践一下。而且在实际测试过程中,有时候需要修改请求或响应数据,或者直接模拟服务器响应,此时可以使用fiddler进行…

容斥原理 训练笔记

​ 容斥原理 设S是一个有限集&#xff0c;A_1,A_2…A_n是S的n个子集&#xff0c;则 ∣ S − ⋃ i 1 n A i ∣ ∑ i 0 n ( − 1 ) i ∑ 1 ≤ j 1 < j 2 . . . < j i ≤ n ∣ ⋂ k 1 i A j k ∣ |S-\bigcup_{i1}^{n}A_i|\sum_{i0}^{n}(-1)^i\sum_{1\leq j_1< j_2.…

okvis

论文 Keyframe-Based Visual-Inertial SLAM Using Nonlinear Optimization 摘要 由于两种感知模式的互补性&#xff0c;视觉和惯性线索的融合在机器人中变得很流行。虽然迄今为止大多数融合策略都依赖于过滤方案&#xff0c;但视觉机器人界最近转向了非线性优化方法&#x…

【React Native】学习记录(二)——路由搭建和常见的开发技巧

模拟器设置成中文 在开发过程中发现&#xff0c;两个模拟器都不能输入中文&#xff0c;所以需要配置一下。 先说一下安卓&#xff0c;在弹出的输入框中查看设置&#xff0c;设置一下对应的languages即可&#xff1a; 在苹果模拟器中&#xff0c;跟苹果手机一样&#xff0c;打…

树莓派本地快速搭建web服务器,并发布公网访问

文章目录 树莓派本地快速搭建web服务器&#xff0c;并发布公网访问 树莓派本地快速搭建web服务器&#xff0c;并发布公网访问 随着科技的发展&#xff0c;电子工业也在不断进步&#xff0c;我们身边的电子设备也在朝着小型化和多功能化演进&#xff0c;以往体积庞大的电脑也在…

Selenium多浏览器处理

Python 版本 #导入依赖 import os from selenium import webdriverdef test_browser():#使用os模块的getenv方法来获取声明环境变量browserbrowser os.getenv("browser").lower()#判断browser的值if browser "headless":driver webdriver.PhantomJS()e…