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.mzph.cn/news/192923.shtml

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

相关文章

【面试经典150 | 二分查找】搜索二维矩阵

文章目录 写在前面Tag题目来源题目解读解题思路方法一:二分查找 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法,两到三天更新一篇文章,欢迎催更…… 专栏内容以分析题目为主,并附带一些对于本题涉及到的数据结构等…

Fiddler抓包工具之fiddler的composer可以简单发送http协议的请求

一,composer的详解 右侧Composer区域,是测试接口的界面: 相关说明: 1.请求方式:点开可以勾选请求协议是get、post等 2.url地址栏:输入请求的url地址 3.请求头:第三块区域可以输入请求头信息…

springmvc+mybatis+mysql8+idea+jqgrid前端

一、背景 主要是为了学习jqgrid前端技术,熟练一下前后端交互数据 二、效果图 访问地址:http://localhost:8080/cr/views/jqGridDemo.jsp 三、代码展示 控制层JqGridController.java Controller RequestMapping("/jqgrid") public class Jq…

拥抱变化,良心AI工具推荐

文章目录 💥 简介🍄 工具介绍🍓 功能特点🥗 使用场景🎉 用户体验🧩 下载地址🍭 总结 💥 简介 我是一名资深程序员,但薪资缺对不起资深两个字,为了生存&#x…

安装selenium+chrome详解

1、创建yaml文件 创建yaml文件,命名为:docker-compose-chrome.yaml,具体内容如下: version: "3.9" services:spiderdriver:image: selenium/standalone-chrome:114.0restart: alwayshostname: spiderdrivercontainer_name: spiderdriverdeploy:resources:limit…

使用Docker部署开源分布式任务调度系统DolphinScheduler

🔥博客主页: 小羊失眠啦. 🎥系列专栏:《C语言》 《数据结构》 《Linux》《Cpolar》 ❤️感谢大家点赞👍收藏⭐评论✍️ 使用Docker部署开源分布式任务调度系统DolphinScheduler 前些天发现了一个巨牛的人工智能学习网…

【iOS】Bug调试

文章目录 前言一、定位编译错误二、设置与查看断点1.文件行断点设置2.符号断点设置3.Exception Breakpoint4.Constraint Error Breakpoint 三、调试工具四、输出窗口五、变量查看窗口六、查看线程七、LLDB调试工具1.p,po命令2.expr命令3.bt命令 前言 在我们的编码过…

Collection的其他相关知识

前置知识:可变参数 就是一种特殊参数,定义在方法 构造器的形参列表里,格式是:数据类型...参数名称; 可变参数的特点和好处 特点:可以不传数据给它;可以传一个或者同时传多个数据给它&#xff…

Vue3+nuxt+ts项目引入高德地图API实现步骤

看了好多相关的文章都没有完全贴合选用Vue3nuxtts框架的,也不太靠谱,只好自己踩坑实现了 首先去高德开放平台用自己的账号申请一个key,位置如下,申请好后保存好生成的key 我们使用vuemap/vue-amap,一个高德地图2.0版本…

阅读软件OmniReader Pro mac功能特色

OmniReader Pro mac是一款文字识别和阅读软件,它可以将印刷体和手写体的文字转换为数字文本,并将其朗读出来。该软件适用于视力受损、阅读困难、语言障碍等用户,可以帮助他们更加轻松地获取信息和阅读文本。 OmniReader Pro具有简洁直观的用户…

单细胞个性化细胞注释

关于单细胞中级的课程内容,前面已经有了三次直播。欢迎回看~ 单细胞直播一理解seurat数据结构与pbmc处理流程 单细胞直播二从GSE104154中理解seurat结构 单细胞直播三seurat数据结构与数据可视化 本期主要内容 本期指哪打哪,自己选定细胞&…

java的四种内部类,从0讲清楚

什么是内部类? 为什么要学习内部类? 可以发现,发动机虽然跟汽车相关,但发动机不像车龄或颜色一样,只用一个变量就可以描述,而是要有发动机品牌,发动机年限,多个变量描述发动机。那么…

MATLAB 自抗扰控制 - Active Disturbance Rejection Control

系列文章目录 MATLAB 模型参考自适应控制 - Model Reference Adaptive Control 文章目录 系列文章目录前言一、控制器结构1.1 一阶逼近1.2 二阶逼近 二、指定控制器参数参考 前言 自抗扰控制 (ADRC) 是一种无模型控制方法,适用于为具有未知动态特性以及内部和外部…

Azure Machine Learning - 使用 Azure SDK 进行全文搜索

了解如何使用 Azure SDK 中的 Azure.Search.Documents 客户端库创建、加载和查询使用示例数据的搜索索引,实现全文搜索。 全文搜索使用 Apache Lucene 进行索引和查询,使用 BM25 排名算法对结果进行评分。 关注TechLead,分享AI全维度知识。作…

【Spring Boot 源码学习】ApplicationContextInitializer 详解

Spring Boot 源码学习系列 ApplicationContextInitializer 详解 引言往期内容主要内容1. 初识 ApplicationContextInitializer2. 加载 ApplicationContextInitializer3. ApplicationContextInitializer 的初始化 总结 引言 书接前文《初识 SpringApplication》,我们…

【傻瓜级JS-DLL-WINCC-PLC交互】6.​向PLC里面装载数据变量

思路 JS-DLL-WINCC-PLC之间进行交互,思路,先用Visual Studio创建一个C#的DLL控件,然后这个控件里面嵌入浏览器组件,实现JS与DLL通信,然后DLL放入到WINCC里面的图形编辑器中,实现DLL与WINCC的通信。然后PLC与…

使用String.valueOf()的坑

说明:记录一次使用String.valueOf()的坑,以下是一段有问题的代码: String count String.valueOf(listData.get(0).get(0).get("count");if (StringUtils.isBlank(count) || "0".equals(count)) {result.setResult(page)…

【bat】批处理脚本大全

目录 1.概述 2.变量 3.运算符 3.2.重定向运算符 3.3.多命名运算符 3.4.管道运算符 4.命令 4.1.基本命令 4.2.参数传递 4.3.查看脚本内容 4.4.注释 4.5.日期和时间 4.6.启动脚本 4.7.调用其他bat 4.8.任务管理 4.8.1.任务列表查看 4.8.2.任务终止 4.9.文件夹 …

美容院管理系统服务预约会员小程序效果如何

美容院在美业场景中需求度较高,尤其女性爱美悦己消费逐年增加,如清洁焕肤、祛皱抗衰、激光脱毛等美容项目都有不少需求者。 互联网深入美业行业多年,传统线下经营模式已经很难满足当今客户消费流程,如品牌寻找、服务预约、到店、…

Effective Java解读

Effective Java 第一章 引言第二章 创建和销毁对象第1条:用静态工厂方法代替构造器第2条:遇到多个构造器参数时要考虑使用构建器第3条:用私有构造器或者枚举类型强化Singletion属性第4条:通过私有构造器强化不可实例化的能力第5条…