java----网络编程(一)

一.什么是网络编程

用户在浏览器中,打开在线视频网站,如优酷看视频,实质是通过网络,获取到网络上的一个视频资源。
在这里插入图片描述
与本地打开视频文件类似,只是视频文件这个资源的来源是网络。所谓网络资源就是网络中获取数据。而所有的网络资源,都是通过网络编程来进行数据传输的。网络编程,指网络上的主机,通过不同的进程,以编程的方式实现网络通信(或称为网络数据传输)。
在这里插入图片描述
当然,我们只要满足进程不同就行;所以即便是同一个主机,只要是不同进程,基于网络来传输数据,也属于网络编程。

发送端和接收端:
在一次网络数据传输时:发送端:数据的发送方进程,称为发送端。发送端主机即网络通信中的源主机。
接收端:数据的接收方进程,称为接收端。接收端主机即网络通信中的目的主机。
收发端:发送端和接收端两端,也简称为收发端。
注意:发送端和接收端只是相对的,只是一次网络数据传输产生数据流向后的概念。

在这里插入图片描述

请求和响应:

一般来说,获取一个网络资源,涉及到两次网络数据传输。第一次:请求数据的发送。第二次:响应数据的发送。

客户端和服务端:

服务端:在常见的网络数据传输场景下,把提供服务的一方进程,称为服务端,可以提供对外服务。
客户端:获取服务的一方进程,称为客户端。对于服务来说,一般是提供:
客户端获取服务资源和客户端保存资源在服务端。

在这里插入图片描述

常见的客户端服务端模型:

最常见的场景,客户端是指给用户使用的程序,服务端是提供用户服务的程序:1. 客户端先发送请求到服务端。2. 服务端根据请求数据,执行相应的业务处理。3. 服务端返回响应:发送业务处理结果。4. 客户端根据响应数据,展示处理结果(展示获取的资源,或提示保存资源的处理结果)

二.UDP和Tcp的特点

这里列举的UDP和Tcp只是很简单的一些特点,后面会详细谈论Tcp和UDP。

udp:无连接,不可靠,全双工,面向数据报。
tcp:有连接,可靠,全双工,面向字节流。

有连接和无连接:JDBC会先创建一个DataSource,再通过DataSource建立Connect连接。比如打电话时对方接通才算建立连接成功。
可靠和不可靠:A尽可能的给B传输信息,传输 失败时,A能感知到。可靠和不可靠都有优缺点,可靠传输效率低,不可靠传输效率高,具体用哪一个要看场景。
字节流和数据报:Tcp和文件操作类似,都是以字节传输的,像流一样。
UDP面向数据报,读写的单位是一个UDP数据报(后面介绍)。
全双工半双工:全双工,一个通道可以双向通信。半双工,一个通道只能单向通信。

三.UDP实现客户端服务器

2个核心类DatagramSocket和DatagramPacket

DatagramSocket

DatagramSocket是一个socket对象,操作系统使用文件这样的概念来管理一些软硬件资源。表示网卡的这类文件被称为socket文件,网卡也是操作系统使用文件来控制的。java的socket对象就对应着socket对象。
在这里插入图片描述
第一个构造方法用于客户端,第二个构造方法指定了端口号用于服务器。
为什么服务器要指定一个特定的端口号,而客户端要一个随机的端口号。
比如我要去学校食堂的2号窗口吃饭,学校就是服务器,我就是客户端。为了让学生每次都能找到,我窗口的位置必须是固定的,使用一个固定的端口号。而学生每次吃饭坐的位置不同,上次做的位置可能这次来被别人占用了,所以需要随机分配一个空闲的座位,也就是分配一个随机的端口号。
在这里插入图片描述

第一个方法是接收数据报,第二个发送数据报,第三个关闭。前2个方法都传入了DatagramPacket 类型的方法参数,那么DatagramPacke是什么?

DatagramPacke

DatagramPacke是一个UDP数据报,代表了系统中设定的UDP数据报的二进制形式。
在这里插入图片描述
DatagramPacket作为UDP数据报,必然要能够承载一些数据,通过手动指定byte[]作为数据的存储空间

实现Udp服务器

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;class UdpSever{public DatagramSocket socket =null;public UdpSever(int port) throws SocketException {this.socket=new DatagramSocket(port);}public void start() throws IOException {System.out.println("客户端启动");while (true){DatagramPacket datagramPacket = new DatagramPacket(new byte[1024],1024);socket.receive(datagramPacket);String str = new String(datagramPacket.getData(),0,datagramPacket.getLength());String requsrt = process(str);DatagramPacket datagramPacket1 = new DatagramPacket(requsrt.getBytes(),requsrt.getBytes().length,datagramPacket.getSocketAddress());socket.send(datagramPacket1);System.out.print("["+datagramPacket.getAddress().toString()+" ");System.out.print(datagramPacket.getPort()+"]:");System.out.print("req:"+str+" ");System.out.println("reqs:"+requsrt);}}public String process(String str){return str;}
}
public class Test3 {public static void main(String[] args) throws IOException {UdpSever udpSever = new UdpSever(9090);udpSever.start();}
}

在这里插入图片描述
创建DatagramPacket对象,传入字节数组,DatagramPacket的返回值是一个字节数组,第一句代码运行结束此时并没有把客户端发来的信息写入。socket.reveive才是把客户端发来的信息真正的写入创建的字节数组中。
在这里插入图片描述
因为写入字节数组的内容二进制形式,所以构造字符串把接收到的二进制内容转换为字符串。同时计算出响应。

UDP客户端

import java.io.IOException;
import java.net.*;
import java.util.Scanner;class Udpclint{public DatagramSocket socket=null;public String SeverIP;public int SeverPort;public Udpclint(String SeverIP,int SeverPort) throws SocketException {this.SeverIP=SeverIP;this.SeverPort=SeverPort;this.socket=new DatagramSocket();}public void start() throws IOException {System.out.println("客户端启动:");while(true){System.out.print("----->");Scanner scanner = new Scanner(System.in);String str = scanner.next();DatagramPacket datagramPacket = new DatagramPacket(str.getBytes(),str.getBytes().length, InetAddress.getByName(SeverIP),SeverPort);socket.send(datagramPacket);DatagramPacket datagramPacket1 = new DatagramPacket(new byte[1024],1024);socket.receive(datagramPacket1);String requst = new String(datagramPacket1.getData(),0,datagramPacket1.getLength());System.out.println(requst);}}}
public class Test4 {public static void main(String[] args) throws IOException {
Udpclint udpclint = new Udpclint("127.0.0.1",9090);
udpclint.start();}
}

客户端和服务器相互搭配运行效果
在这里插入图片描述
在这里插入图片描述

根据客户端和服务器代码实现翻译功能

分析:字典功能需要客户端输入中文意思,服务器显示英文单词。只需要客户端在计算响应的时候,实现翻译处理,所以让自己实现的翻译类继承服务器类,重写计算响应的方法(process),使其具备翻译功能

import java.io.IOException;
import java.net.SocketException;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;class GrammerSever extends UdpSever{Map<String,String> map = new HashMap<>();public GrammerSever(int port) throws SocketException {super(port);map.put("猫","cat");map.put("狗","dog");map.put("鱼","fish");}@Overridepublic String process(String str) {return map.get(str);}
}
public class Test5 {public static void main(String[] args) throws IOException {GrammerSever grammerSever = new  GrammerSever(9090);grammerSever.start();}
}

在这里插入图片描述
在这里插入图片描述

Tcp实现

Tcp分量要比Udp更重,用的更多的协议,,Tcp主要有2个类,SeverSocket和socket。给服务器用seversocket,socket既可以客户端使用也可以服务器使用。

Tcp服务器

mport java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;class TcpSever{public ServerSocket socket = null;public ExecutorService executorService = Executors.newCachedThreadPool();public TcpSever(int port) throws IOException {this.socket=new ServerSocket(port);}public void start() throws IOException {System.out.println("服务器启动:");while(true){Socket socket1 = socket.accept();executorService.submit(new Runnable() {@Overridepublic void run() {try {process(socket1);} catch (IOException e) {throw new RuntimeException(e);}}});}}public void process(Socket socket1) throws IOException {System.out.printf("[%s:%d] 客户端上线!\n", socket1.getInetAddress().toString(), socket1.getPort());try(InputStream inputStream = socket1.getInputStream();OutputStream outputStream = socket1.getOutputStream()) {while (true){Scanner scanner =new Scanner(inputStream);if(!scanner.hasNext()){System.out.printf("[%s:%d] 客户端下线!\n", socket1.getInetAddress().toString(), socket1.getPort());break;}String requst = scanner.next();String requse = process1(requst);PrintWriter printWriter = new PrintWriter(outputStream);printWriter.println(requse);printWriter.flush();System.out.printf("[%s:%d] req: %s, resp: %s\n", socket1.getInetAddress().toString(), socket1.getPort(),requse, requst);}} catch (IOException e) {throw new RuntimeException(e);}finally {socket1.close();}}public  String process1(String str){return str;}
}
public class Test {public static void main(String[] args) throws IOException {
TcpSever tcpSever = new TcpSever(22);
tcpSever.start();}
}

在这里插入图片描述
Tcp首先要处理连接,内核的连接就想一个待办事项,这些待办事项在一个队列的数据结构中,应用程序就需要一个一个完成这些任务,要完成这些任务就得先取任务。
在这里插入图片描述
accept是把内核中已经建立好的连接拿到应用程序中,但是这里的返回值并非是一个connect这样的对象,而只是一个socket对象,这个socket对象就像一个耳麦一样可以说话也可以听到对方的声音。
在这里插入图片描述

Tcp客户端

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;class Tcpclint{public Socket socket =null;public Tcpclint(String IP,int port) throws IOException {this.socket=new Socket(IP,port);}public void start(){System.out.println("客户端启动:");try(InputStream inputStream = socket.getInputStream();OutputStream outputStream =socket.getOutputStream()) {while (true) {System.out.print("-------->");Scanner scanner = new Scanner(System.in);String str = scanner.next();PrintWriter printWriter = new PrintWriter(outputStream);printWriter.println(str);printWriter.flush();Scanner scanner1 = new Scanner(inputStream);String str1 = scanner1.next();System.out.println(str1);}} catch (IOException e) {throw new RuntimeException(e);}}
}
public class Test2 {public static void main(String[] args) throws IOException {Tcpclint tcpclint = new Tcpclint("127.0.0.1",22);tcpclint.start();}
}

在这里插入图片描述
在这里插入图片描述

Tcp实现单词翻译功能

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;class Grammer extends  TcpSever{Map<String,String> map = new HashMap<>();public Grammer(int port) throws IOException {super(port);map.put("猫","cat");map.put("狗","dog");map.put("鱼","fish");}@Overridepublic String process1(String str) {return map.get(str);}
}
public class Test7 {public static void main(String[] args) throws IOException {Grammer grammer =new Grammer(9090);grammer.start();}
}

在这里插入图片描述
在这里插入图片描述

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

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

相关文章

LabVIEW提升舱救援通讯监测系统

LabVIEW提升舱救援通讯监测系统 随着科技的进步&#xff0c;煤矿救援工作面临着许多新的挑战。为了提高救援效率和安全性&#xff0c;设计并实现了一套基于LabVIEW的提升舱救援通讯监测系统。该系统能够实时监控提升舱内的环境参数和视频图像&#xff0c;确保救援人员和被困人…

el-input设置max、min无效的解决方案

目录 一、方式1&#xff1a;type“number” 二、方式2&#xff1a;oninput&#xff08;推荐&#xff09; 三、计算属性 如下表所示&#xff0c;下面为官方关于max&#xff0c;min的介绍&#xff1a; el-input&#xff1a; max原生属性&#xff0c;设置最大值min原生属性&a…

06.共享内存

1.内存映射&#xff08;mmap&#xff09; 我们在单片机中首先接触到了映射的概念 将一个寄存器的地址映射到了另外的一个存储空间中 内存映射: 内存映射&#xff08;Memory Mapping&#xff09;是一种在计算机科学中使用的技术&#xff0c;它允许将文件或其他设备的内容映射…

idea warning:java源值已过时将在未来所有发行版中删除

在idea中运行maven项目 如果出现idea warning:java源值已过时将在未来所有发行版中删除&#xff0c;详见如下截图所示&#xff1a; 注意&#xff1a;jdk8 要解决这个警告需要设置3个地方 首先打开File->Project Structure中的Project&#xff0c;将SDK和language level都设…

五、保持长期高效的七个法则(二)Rules for Staying Productive Long-Term(1)

For instance - lets say youre a writer.You have a bunch of tasks on your plate for the day, but all of a sudden you get a really good idea for an essay. You should probably start writing now or youll lose your train of thought.What should you do? 举例来说…

分布式搜索引擎(3)

1.数据聚合 **[聚合&#xff08;](https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations.html)[aggregations](https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations.html)[&#xff09;](https://www.ela…

机器学习(26)回顾gan+文献阅读

文章目录 摘要Abstract一、李宏毅机器学习——GAN1. Introduce1.1 Network as Generator1.2 Why distribution 2. Generative Adversarial Network2.1 Unconditional generation2.2 Basic idea of GAN 二、文献阅读1. 题目2. abstract3. 网络架构3.1 Theoretical Results 4. 文…

Oracle P6 Professional 配置连接数据库总结

前言 P6 Professional作为Oracle P6计划管理系统的重要套件之一&#xff0c;其操作出色&#xff0c;体检佳&#xff0c;是非常多的计划工程师跟踪项目进度计划的辅助工具。自20年前&#xff0c;Professional一直在不断的演变更新&#xff0c;以适应当前的新技术&#xff0c;从…

【MySQL】MySQL事务

文章目录 一、CURD不加控制&#xff0c;会有什么问题&#xff1f;二、事务的概念三、事务出现的原因四、事务的版本支持五、事务提交方式六、事务常见操作方式七、事务隔离级别1.理解隔离性12.隔离级别3.查看与设置隔离性4.读未提交【Read Uncommitted】5.读提交【Read Committ…

【Numpy】练习题100道(76-100题完结)

&#x1f33b;个人主页&#xff1a;相洋同学 &#x1f947;学习在于行动、总结和坚持&#xff0c;共勉&#xff01; #学习笔记# Git-hub链接 题目列表&#xff08;题解往下翻&#xff09; 76.考虑一个一维数组Z&#xff0c;构建一个二维数组&#xff0c;其第一行为(Z[0],Z[…

【鸿蒙HarmonyOS开发笔记】组件编程技巧之使用@Builder装饰器实现UI结构复用

概述 当页面有多个相同的UI结构时&#xff0c;若每个都单独声明&#xff0c;同样会有大量重复的代码。为避免重复代码&#xff0c;可以将相同的UI结构提炼为一个自定义组件&#xff0c;完成UI结构的复用。 除此之外&#xff0c;ArkTS还提供了一种更轻量的UI结构复用机制Build…

小白DB补全计划Day1-LeetCode:SQL基本操作select

前言&#xff1a;找工作&#xff08;主人&#xff09;的任务罢了 链接&#xff1a;1757. 可回收且低脂的产品 - 力扣&#xff08;LeetCode&#xff09; 584. 寻找用户推荐人 - 力扣&#xff08;LeetCode&#xff09; 来源&#xff1a;LeetCode 对DB篇的SQL章不太知道怎么写…

数学建模-估计出租车的总数

文章目录 1、随机抽取的号码在总体的排序 1、随机抽取的号码在总体的排序 10个号码从小到大重新排列 [ x 0 , x ] [x_0, x] [x0​,x] 区间内全部整数值 ~ 总体 x 1 , x 2 , … , x 10 总体的一个样本 x_1, x_2, … , x_{10} ~ 总体的一个样本 x1​,x2​,…,x10​ 总体的一个样…

mysql与redis数据测试

题目要求 1.新建一张user表&#xff0c;在表内插入10000条数据。 2.①通过jdbc查询这10000条数据&#xff0c;记录查询时间。 ②通过redis查询这10000条数据&#xff0c;记录查询时间。 3.再次查询这一万条数据&#xff0c;要求根据年龄进行排序&#xff0c;mysql和redis各实现…

【FPGA/IC】什么是模块化设计?

什么是模块化设计 FPGA/IC设计中根据模块层次的不同有两种基本的设计方法&#xff1a; 自下而上方法对设计进行逐次划分的过程是从基本单元出发的&#xff0c;设计树最末枝上的单元是已经设计好的基本单元&#xff0c;或者其他项目开发好的单元或者IP。该方法先对底层的功能块…

探索发布-订阅模式的深度奥秘-实现高效、解耦的系统通信

​&#x1f308; 个人主页&#xff1a;danci_ &#x1f525; 系列专栏&#xff1a;《设计模式》 &#x1f4aa;&#x1f3fb; 制定明确可量化的目标&#xff0c;坚持默默的做事。 &#x1f680; 转载自&#xff1a;探索设计模式的魅力&#xff1a;探索发布-订阅模式的深度奥秘-…

Jest:JavaScript的单元测试利器

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

作品展示ETL

1、ETL 作业定义、作业导入、控件拖拽、执行、监控、稽核、告警、报告导出、定时设定 欧洲某国电信系统数据割接作业定义中文页面&#xff08;作业顶层&#xff0c;可切英文&#xff0c;按F1弹当前页面帮助&#xff09; 涉及文件拆分、文件到mysql、库到库、数据清洗、数据转…

Vue mqtt 附在线mqtt客户端地址 + 完整示例

mqtt&#xff1a;轻量级物联网消息推送协议。 目录 一、介绍 1、官方文档 1&#xff09;npm网 2) 中文网 MQTT中文网_MQTT 物联网接入平台-MQTT.CN 2、官方示例 二、准备工作 1、安装依赖包 2、示例版本 三、使用步骤 1、在单页面引入 mqtt 四、完整示例 tips 一、介…

渐开线花键环规的几种加工方法

小伙伴们大家好&#xff0c;今天咱们聊一聊渐开线花键环规的几种加工方法。 渐开线花键环规是在汽车、摩托车以及机械制造工业应用非常广泛的一种检测量具。它属于是一种内花键齿轮&#xff0c;其精度和表面粗糙度要求都比较高。采用的加工方法也比较多&#xff0c;下面详细看…