Java(十)(网络编程,UDP,TCP)

目录

网络编程

两种软件架构

网络通信的三要素

IP

IPv4的地址分类

特殊IP

端口号

协议

用UDP协议发送数据 

用UDP接收数据

TCP接收和发送数据

TCP通信--支持与多个客户端同时通信


网络编程

可以让设备中的程序与网络上其他设备的程序进行数据交互(实现网络通信)

两种软件架构

CS:在用户本地需要下载并安装客户端程序,在远程有一个服务器端程序

BS:只需要一个浏览器,用户通过不同的网址,客户访问不同的服务器

网络通信的三要素

IP

设备在网络中的地址,是唯一的标识

有IPv4和IPv6

最多有2^32次方的ip,目前用完了

IPv4中不够用,就有了IPv6

为了解决ipv4不够用而出现的,最多有2^128次方的ip

IPv4的地址分类

公网地址(万维网使用)和私有地址(局域网使用)

192.168.开头的就是私有地址,范围即为192.168.0.0--192.168.255.255,专门为组织机构内部使用,以此节约IP

特殊IP

127.0.0.1,也可以是localhost:是回送地址也称本地回环地址,也成为本机IP,永远只会寻找当前所在的本机

常用的CMD命令

ipconfig:查看本机IP地址

ping:检查网络是否连通

public class ip {public static void main(String[] args) throws UnknownHostException {// 1.获取InetAddress的对象// IP的对象  一台电脑对象InetAddress address = InetAddress.getByName("192.168.135.1");System.out.println(address);String name = address.getHostName();System.out.println(name);String ip = address.getHostAddress();System.out.println(ip);}
}

端口号

应用程序在设备中唯一的标识

端口号: 由两个字节表示的整数,取值范围:0-665535,其中0-1023之间的端口用于一些知名的网络服务或应用,我们自己使用1024以上的端口就可以了

协议

数据在网路中传输的规则

UDP协议: 用户数据报协议

UDP是面向无连接通信协议

速度快,有大小限制一次最多发送64K,数据不安全,易丢失数据

TCP协议:传输控制协议

TCP协议是面向连接的通信协议

速度慢,没有大小限制,数据安全

下面是用UDP来发收数据

用UDP协议发送数据 
public class ip {public static void main(String[] args) throws IOException {// 发送数据// 1.创建DatagramSocket对象// 细节://绑定端口,以后我们就是通过这个端口往外发送//有参:指定端口号进行绑定DatagramSocket ds = new DatagramSocket();// 打包数据String str = "hello world";byte[] bytes = str.getBytes(); // 将str转换成字节数组来用来打包数据InetAddress address = InetAddress.getByName("127.0.0.1");  // 表示那台ip电脑来接受int port=10086; //被发数据电脑接收的端口DatagramPacket dp = new DatagramPacket(bytes,bytes.length,address,port);// 3. 发送数据ds.send(dp);// 4.释放资源ds.close();}
}
用UDP接收数据
public class receive {public static void main(String[] args) throws IOException {// 接收数据// 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,len));System.out.println("该数据是从"+address+"接口是"+port);// .释放资源ds.close();}
}
TCP接收和发送数据

通信双方事先会采用"三次握手"方式建立可靠连接,实现端到端的通信;底层能保证数据成功传到服务端

一发一收

创建客户端

import java.io.DataOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;public class Tcp {public static void main(String[] args) throws IOException {// 1.创建Socket对象,并同时请求与服务器程序的连接Socket socket = new Socket("127.0.0.1",8888);// 2.从socket通信管道中得到一个字节输出流,用来发数据给服务端程序OutputStream os = socket.getOutputStream();// 3.把低级的字节输出流包装成数据流DataOutputStream dos = new DataOutputStream(os);//4.开始写数据出去了dos.writeUTF("在一起,好吗?");dos.close();socket.close();}
}

创建服务器

import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;public class Res {public static void main(String[] args) throws IOException {System.out.println("------服务端启动成功------");// 1.创建ServerSocket的对象,同时为服务端注册端口ServerSocket serverSocket = new ServerSocket(8888);// 2.使用serverSocket对象,调用一个accept方法,等待客户端的连接请求Socket socket = serverSocket.accept();// 3. 从socket通信管道中得到一个字节输入流InputStream is = socket.getInputStream();//4.把原始的字节输入流包装成数据输入流DataInputStream dis = new DataInputStream(is);//5.使用数据输入流读取客户端发送的消息String rs = dis.readUTF();System.out.println(rs);// 其实我们也可以获取客户端的IP地址System.out.println(socket.getRemoteSocketAddress());dis.close();socket.close();}
}

多发多收

发送数据

import java.io.DataOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;public class Tcp {public static void main(String[] args) throws IOException {// 1.创建Socket对象,并同时请求与服务器程序的连接Socket socket = new Socket("127.0.0.1",8888);// 2.从socket通信管道中得到一个字节输出流,用来发数据给服务端程序OutputStream os = socket.getOutputStream();// 3.把低级的字节输出流包装成数据流DataOutputStream dos = new DataOutputStream(os);Scanner sc = new Scanner(System.in);while (true) {System.out.println("请说: ");String msg = sc.nextLine();// 一旦用户输入exit,就退出客户端程序if("exit".equals(msg)){System.out.println("欢迎你下次光临!退出成功");dos.close();socket.close();break;}//4.开始写数据出去了dos.writeUTF(msg);dos.flush();}}
}

接收数据

import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;public class Res {public static void main(String[] args) throws IOException {System.out.println("------服务端启动成功------");// 1.创建ServerSocket的对象,同时为服务端注册端口ServerSocket serverSocket = new ServerSocket(8888);// 2.使用serverSocket对象,调用一个accept方法,等待客户端的连接请求Socket socket = serverSocket.accept();// 3. 从socket通信管道中得到一个字节输入流InputStream is = socket.getInputStream();//4.把原始的字节输入流包装成数据输入流DataInputStream dis = new DataInputStream(is);while (true) {try {//5.使用数据输入流读取客户端发送的消息String rs = dis.readUTF();System.out.println(rs);} catch (IOException e) {System.out.println(socket.getRemoteSocketAddress()+"离线了");socket.close();dis.close();break;}}}
}
TCP通信--支持与多个客户端同时通信

我们应该整一个多线程的写法,每个客户端写成一个线程

创建客户端

public class tcp {public static void main(String[] args) throws IOException {Socket socket = new Socket("127.0.0.1",9999);OutputStream os = socket.getOutputStream();DataOutputStream dos = new DataOutputStream(os);// 1. 多发多收Scanner sc = new Scanner(System.in);while (true) {String msg = sc.nextLine();if("886".equals(msg)){System.out.println("下线");break;}dos.writeUTF(msg);}}
}

创建服务端

public class res {public static void main(String[] args) throws IOException {ServerSocket serverSocket =new ServerSocket(9999);while (true) {Socket socket = serverSocket.accept();System.out.println("有人上线了"+socket.getRemoteSocketAddress());new SeverSocketThread(socket).start();}}
}

我们看看线程的写法

package TCP_test;import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;public class SeverSocketThread extends Thread{private Socket socket;public SeverSocketThread(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());dis.close();is.close();socket.close();break;}}} catch (IOException e) {System.out.println(socket.getRemoteSocketAddress() + "下线");}}
}

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

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

相关文章

go自定义端口监听停用-------解决端口被占用的问题

代码 package mainimport ("fmt""log""net""os/exec""strconv""strings" )func getSelect(beign int, end int) int {var num intfor {_, err : fmt.Scan(&num)if err ! nil {fmt.Println("输入错误&am…

redis实现消息延迟队列

业务场景 在很多软件系统功能中都会出现定时任务的业务场景,比如提前点单,比如定时发布动态,文章等而出现这样的的定时的任务为延迟队任务 代码模块 任务的持久化一般都需要建立一个任务表和任务日志表,避免宕机导致任务失效,先新建立一个数据库,创建基本的任务表和任务日志表…

字符串冲刺题

关卡名 字符串冲刺题 我会了✔️ 内容 1.掌握最长公共前缀问题 ✔️ 2.掌握字符串压缩问题 ✔️ 3.如果想挑战一下就研究:表示数值的字符串 ✔️ 1 最长公共前缀 这是一道经典的字符串问题,LeetCode14 先看题目要求:编写一个函数来查找…

28.线段树与树状数组基础

一、线段树 1.区间问题 线段树是一种在算法竞赛中常用来维护区间的数据结构。它思想非常简单,就是借助二叉树的结构进行分治,但它的功能却非常强大,因此在很多类型的题目中都有它的变种,很多题目都需要以线段树为基础进行发展。…

git报错invalid object xxx和unable to read tree xxxxxx

电脑出问题了,导致git仓库像是被损坏了一样,执行git status就会报错unable to read ree,无法正常提交代码至仓库,原因是本地代码仓库.git文件损坏了,无法找到正确的提交历史和路径。 找到了一个解决办法: …

数学字体 Mathematical fonts

Mathematical fonts 数学字体: ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzRQSZ \\ \mathcal{ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzRQSZ} \\ \mathfrak{ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzRQSZ} \\ \mathbb{ABC…

geemap学习笔记015:下载哨兵2号(Sentinel-2)数据

前言 使用GEE下载数据应该是最常见的功能了,今天就介绍一下如何使用geemap下载哨兵2号(Sentinel-2)数据,分别包括自己画感兴趣,以及利用Assets中的shp文件进行下载。 1 自己画感兴趣下载哨兵2号影像 import geemap import eeMap geemap.M…

MQ - 消息系统

消息系统 1、消息系统的演变 在大型系统中,会需要和很多子系统做交互,也需要消息传递,在诸如此类系统中,你会找到源系统(消息发送方)和 目的系统(消息接收方)。为了在这样的消息系…

了解ThreadLocal的原理吗

程序员的公众号:源1024,获取更多资料,无加密无套路! 最近整理了一份大厂面试资料《史上最全大厂面试题》,Springboot、微服务、算法、数据结构、Zookeeper、Mybatis、Dubbo、linux、Kafka、Elasticsearch、数据库等等 …

YOLOv5改进 | 添加ECA注意力机制 + 更换主干网络之ShuffleNetV2

前言:Hello大家好,我是小哥谈。本文给大家介绍一种轻量化部署改进方式,即在主干网络中添加ECA注意力机制和更换主干网络之ShuffleNetV2,希望大家学习之后,能够彻底理解其改进流程及方法~!🌈 目…

解读Java虚拟机垃圾回收器:探究经典算法背后的奥秘

目录 一、GC分类与性能指标 (一)垃圾回收器分类 (二)性能指标 (三)不可能三角 二、不同的垃圾回收器概述 三、Serial回收器:串行回收 四、ParNew回收器:并行回收 五、Parall…

untiy webgl常见问题与操作

文章目录 1 untiy和网页相互通信2 打开新页面(同标签页和新标签页)3 获取网页的URL4 解析Url内的参数5 后处理与色彩空间问题 1 untiy和网页相互通信 看这个文章 2 打开新页面(同标签页和新标签页) 先看本文untiy和网页相互通信…

WEB渗透—反序列化(八)

Web渗透—反序列化 课程学习分享(课程非本人制作,仅提供学习分享) 靶场下载地址:GitHub - mcc0624/php_ser_Class: php反序列化靶场课程,基于课程制作的靶场 课程地址:PHP反序列化漏洞学习_哔哩哔_…

智慧垃圾分拣站:科技改变城市环境,创造更美好的未来

随着城市化进程的不断加快,垃圾处理问题日益凸显。为了更好地解决垃圾分类问题,越来越多的城市开始推广智慧垃圾分拣站,利用创新科技实现高效垃圾分类处理。 山海鲸使用三维建模技术,建立了一个智慧垃圾分拣站数字孪生模型&#x…

《数据结构、算法与应用C++语言描述》-优先级队列-大根堆的C++实现

优先级队列 完整可编译运行代码见:Github::Data-Structures-Algorithms-and-Applications/_25Priority queue 定义 优先级队列(priority queue)是0个或多个元素的集合,每个元素都有一个优先权或值,对优先级队列执行…

53.redis分布式缓存

目录 一、单机安装Redis。 二、Redis主从集群。 2.1.集群结构 2.2.准备实例和配置 2.3.启动 2.4.开启主从关系 2.5.测试 三、搭建哨兵集群。 3.1.集群结构 3.2.准备实例和配置 3.3.启动 3.4.测试 四、搭建分片集群。 4.1.集群结构 4.2.准备实例和配置 4.3.启动…

【附代码】Python函数性能测试(perfplot)

文章目录 相关文献测试电脑配置展开元素是list的list在numpy数组上映射函数的最有效方法数组numpy中唯一值的最有效频率计数方法反转numpy数组的最有效方法如何向 numpy 数组添加额外的列将 numpy 矩阵初始化为零或一以外的值 作者:小猪快跑 基础数学&计算数学&…

基于helm的方式在k8s集群中部署gitlab - 备份恢复(二)

接上一篇 基于helm的方式在k8s集群中部署gitlab - 部署(一),本篇重点介绍在k8s集群中备份gitlab的数据,并在虚拟机上部署相同版本的gitlab,然后将备份的数据进行还原恢复 文章目录 1. 备份2. 恢复到虚拟机上的gitlab2.…

第九节HarmonyOS 常用基础组件4-Button

一、Button Button组件主要用来响应点击操作,可以包含子组件。 示例代码: Entry Component struct Index {build() {Row() {Column() {Button(确定, { type: ButtonType.Capsule, stateEffect: true }).width(90%).height(40).fontSize(16).fontWeigh…

软件工程精品课程教学网站的设计与实现

系统功能需求分析 本系统要求采用Browser/Server模式设计开发,可以作为一般高等院校的网络学堂;可以为教师的辅助教学或者网络教学提供一个完善的教学网站;学生可以利用本教学网站来完成一些课程的学习任务。 2.2.1 功能划分 《软件工程》教学…