十九、网络编程

目录

  • 一、什么是网络编程
  • 二、网络编程三要素
    • 2.1 IP
    • 2.2 InetAddress的使用
    • 2.3 端口号
    • 2.4 协议
  • 三、UDP通信程序
    • 3.1 发送数据
    • 3.2 接收数据
    • 3.3 练习
  • 四、UDP的三种通信方式
  • 五、TCP的通信程序
  • 六、三次握手和四次挥手
  • 七、练习
    • 7.1 TCP通信练习1——多发多收
    • 7.2 TCP通信练习2——接收和反馈
    • 7.3 TCP通信练习3——上传文件
    • 7.4 TCP通信练习4——上传文件(文件名重复问题)
    • 7.5 TCP通信练习5——上传文件(多线程版)
    • 7.6 TCP通信练习6——上传文件(线程池优化)
    • 7.7 TCP通信练习7——BS(接收浏览器的消息并打印)


一、什么是网络编程

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

二、网络编程三要素

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

2.1 IP

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

2.2 InetAddress的使用

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

2.3 端口号

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

2.4 协议

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

三、UDP通信程序

3.1 发送数据

在这里插入图片描述

public static void main(String[] args) throws IOException {//1.创建DatagramSocket对象(快递公司)//细节://绑定端口,以后我们就是通过这个端口往外发送//空参:所有可用的端口中随机一个进行使用//有参:指定端口号进行绑定DatagramSocket ds = new DatagramSocket();//1.打包数据String str = "你好啊!";byte[] bytes = str.getBytes();InetAddress address = InetAddress.getByName("127.0.0.1");int port = 10086;DatagramPacket dp = new DatagramPacket(bytes, bytes.length, address, port);//2.发送数据ds.send(dp);//3.释放资源ds.close();}

3.2 接收数据

在这里插入图片描述

public static void main(String[] args) throws IOException {//0.创建对象//细节://在接收的时候,一定要绑定端口//而且绑定的端口一定要跟发送的端口保持一致DatagramSocket ds = new DatagramSocket(10086);//1.接收数据byte[] bytes = new byte[1024];DatagramPacket dp = new DatagramPacket(bytes, bytes.length);//该方法是阻塞的//程序执行到这一步的时候,会在这里死等//等发送端发送消息ds.receive(dp);//2.解析数据byte[] data = dp.getData();InetAddress address = dp.getAddress();int port = dp.getPort();int length = dp.getLength();System.out.println("发送的数据是:" + new String(data, 0, length));System.out.println("这条数据是从" + address + "的" + port + "端口发送出来的");//3.释放资源ds.close();}

3.3 练习

在这里插入图片描述
接收端:

public static void main(String[] args) throws IOException {DatagramSocket ds = new DatagramSocket(10086);byte[] bytes = new byte[1024];DatagramPacket dp = new DatagramPacket(bytes, bytes.length);while (true) {ds.receive(dp);byte[] data = dp.getData();String hostAddress = dp.getAddress().getHostAddress();String hostName = dp.getAddress().getHostName();int length = dp.getLength();System.out.println("ip为:" + hostAddress + ",主机名为:" + hostName + "发送的数据是:" + new String(data, 0, length));}}

发送端

public static void main(String[] args) throws IOException {DatagramSocket ds = new DatagramSocket();Scanner sc = new Scanner(System.in);System.out.println("请输入您要说的话:");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();}

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

四、UDP的三种通信方式

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

public static void main(String[] args) throws IOException {//组播发送代码MulticastSocket ms = new MulticastSocket();String s = "你好你好";byte[] bytes = s.getBytes();InetAddress address = InetAddress.getByName("224.0.0.2");int port = 10086;DatagramPacket dp = new DatagramPacket(bytes, bytes.length, address, port);//发送数据ms.send(dp);//释放资源ms.close();}
public static void main(String[] args) throws IOException {MulticastSocket ms = new MulticastSocket(10086);//将当前本机,添加到224.0.0.2的这一组当中InetAddress address = InetAddress.getByName("224.0.0.2");ms.joinGroup(address);//创建数据包对象byte[] bytes = new byte[1024];DatagramPacket dp = new DatagramPacket(bytes, bytes.length);//接收数据ms.receive(dp);//解析数据String hostAddress = dp.getAddress().getHostAddress();String hostName = dp.getAddress().getHostName();byte[] data = dp.getData();int length = dp.getLength();int port = dp.getPort();System.out.println("ip为:" + hostAddress + ",主机名为:" + hostName + "的人,发送了数据:" + new String(data, 0, length));ms.close();}

public static void main(String[] args) throws IOException {//广播发送代码MulticastSocket ms = new MulticastSocket();String s = "你好你好";byte[] bytes = s.getBytes();InetAddress address = InetAddress.getByName("255.255.255.255");int port = 10086;DatagramPacket dp = new DatagramPacket(bytes, bytes.length, address, port);//发送数据ms.send(dp);//释放资源ms.close();}

五、TCP的通信程序

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

public static void main(String[] args) throws IOException {//TCP协议 接收数据//0.创建对象ServerSocket ss = new ServerSocket(10086);//1.监听客户端Socket accept = ss.accept();//2.从连接通道中获取输入流读取数据InputStream is = accept.getInputStream();int b;while ((b = is.read()) != -1) {System.out.println((char) b);}is.close();accept.close();ss.close();}

public static void main(String[] args) throws IOException {//TCP协议发送数据//1.创建Socket对象//细节:在创建对象时会连接服务端, 如果连接不上,代码会报错Socket socket = new Socket("127.0.0.1",10086);//从连接通道中获取输出流OutputStream os = socket.getOutputStream();os.write("aaa".getBytes());os.close();socket.close();}

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

六、三次握手和四次挥手

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

七、练习

7.1 TCP通信练习1——多发多收

客户端:多次发送数据
服务器:接收多次数据,并打印
public static void main(String[] args) throws IOException {/*客户端:多次发送数据服务器:接收多次数据,并打印*///0.创建Socket对象Socket socket = new Socket("127.0.0.1", 10086);//写出数据Scanner sc = new Scanner(System.in);OutputStream os = socket.getOutputStream();while (true) {System.out.println("请输入您要发送的消息:");String str = sc.nextLine();if (str.equals("886")){break;}os.write(str.getBytes());}//释放资源socket.close();}
public static void main(String[] args) throws IOException {//创建ServerSocket对象ServerSocket ss = new ServerSocket(10086);//等待客户端连接Socket accept = ss.accept();//读取数据InputStreamReader isr = new InputStreamReader(accept.getInputStream());int b;while ((b = isr.read()) != -1){System.out.print((char) b);}//释放资源ss.close();}

7.2 TCP通信练习2——接收和反馈

客户端:发送一条数据,接收服务端反馈的消息并打印
服务器:接收数据并打印,再给客户端反馈消息
public class Client {public static void main(String[] args) throws IOException {/*客户端:发送一条数据,接收服务端反馈的消息并打印服务器:接收数据并打印,再给客户端反馈消息*///0.创建一个Socket对象Socket s = new Socket("127.0.0.1", 10086);//1.写出数据String str = "见到你很高兴!";OutputStream os = s.getOutputStream();os.write(str.getBytes());//结束标记s.shutdownOutput();//3.接收服务器回写的数据InputStream is = s.getInputStream();InputStreamReader isr = new InputStreamReader(is);int b;while ((b = isr.read()) != -1) {System.out.println((char) b);}//释放资源s.close();}
}
public class Server {public static void main(String[] args) throws IOException {//0.创建ServerSocket对象ServerSocket ss = new ServerSocket(10086);//1.等待客户端连接Socket accept = ss.accept();//2.获取数据InputStream is = accept.getInputStream();InputStreamReader isr = new InputStreamReader(is);int b;while ((b = isr.read()) != -1){System.out.println((char) b);}//3.会写数据String str = "到底有多开心呢?";OutputStream os = accept.getOutputStream();os.write(str.getBytes());//释放资源accept.close();ss.close();}
}

7.3 TCP通信练习3——上传文件

客户端:将本地文件上传到服务器。接收服务器的反馈。
服务器:接收客户端上传的文件,上传完毕之后给出反馈。

在这里插入图片描述

public class Server {public static void main(String[] args) throws IOException {//创建ServerSocket对象ServerSocket ss = new ServerSocket(10086);//等待客户端连接Socket socket = ss.accept();//读取数据并保存到本地文件中BufferedInputStream bis = new BufferedInputStream(socket.getInputStream());BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("day32_code\\ServerDir\\a.jpg"));int len;byte[] bytes = new byte[1024];while ((len = bis.read(bytes)) != -1) {bos.write(bytes, 0, len);}bos.close();//会写数据BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));bw.write("上传成功");bw.newLine();bw.flush();socket.close();ss.close();}
}
public class Client {public static void main(String[] args) throws IOException {//0.创建Socket对象Socket s = new Socket("127.0.0.1", 10086);//1.创建BufferedWriter关联本地文件BufferedInputStream bis = new BufferedInputStream(new FileInputStream("day32_code\\ClientDir\\a.jpg"));BufferedOutputStream bos = new BufferedOutputStream(s.getOutputStream());int len;byte[] bytes = new byte[1024];while ((len = bis.read(bytes)) != -1) {bos.write(bytes, 0, len);}s.shutdownOutput();//接收服务器的回写数据BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));String line = br.readLine();System.out.println(line);//释放资源s.close();}
}

7.4 TCP通信练习4——上传文件(文件名重复问题)

解决上一题文件名重复问题

在这里插入图片描述

public class UUIDTest {public static void main(String[] args) {String s = UUID.randomUUID().toString().replace("-", "");System.out.println(s);}
}
String filename = UUID.randomUUID().toString().replace("-", "");
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("day32_code\\ServerDir\\" + filename + "+.jpg"));

7.5 TCP通信练习5——上传文件(多线程版)

想要服务器不停止,能接收很多用户上传的图片。
该怎么做呢?
提示:可以用循环或者多线程。
但是循环不合理,最优解发是用循环+多线程改写
public class MyRunable implements Runnable {Socket socket;public MyRunable(Socket socket) {this.socket = socket;}@Overridepublic void run() {try {String filename = UUID.randomUUID().toString().replace("-", "");BufferedInputStream bis = new BufferedInputStream(socket.getInputStream());BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("day32_code\\ServerDir\\" + filename + "+.jpg"));int len;byte[] bytes = new byte[1024];while ((len = bis.read(bytes)) != -1) {bos.write(bytes, 0, len);}bos.close();//会写数据BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));bw.write("上传成功");bw.newLine();bw.flush();} catch (IOException e) {e.printStackTrace();} finally {if (socket != null) {try {socket.close();} catch (IOException e) {e.printStackTrace();}}}}
}
public class Server {public static void main(String[] args) throws IOException {//创建ServerSocket对象ServerSocket ss = new ServerSocket(10086);while (true) {//等待客户端连接Socket socket = ss.accept();//读取数据并保存到本地文件中//开启一条线程//一个用户对应服务端的一条线程new Thread(new MyRunable(socket)).start();}}
}

7.6 TCP通信练习6——上传文件(线程池优化)

频繁创建线程并销毁非常浪费系统资源,所以需要用线程池优化
public class Server {public static void main(String[] args) throws IOException {//创建ServerSocket对象ServerSocket ss = new ServerSocket(10086);//创建线程池对象ThreadPoolExecutor pool = new ThreadPoolExecutor(3, // 核心线程数量16, // 线程池总大小60, // 空闲时间TimeUnit.SECONDS, // 空闲时间(单位)new ArrayBlockingQueue<>(2) , // 队列Executors.defaultThreadFactory(), // 线程工厂new ThreadPoolExecutor.AbortPolicy() // 阻塞队列);while (true) {//等待客户端连接Socket socket = ss.accept();//读取数据并保存到本地文件中//开启一条线程//一个用户对应服务端的一条线程new Thread(new MyRunable(socket)).start();}}
}

7.7 TCP通信练习7——BS(接收浏览器的消息并打印)

客户端:不需要写
服务器:接收数据并打印。
public class Server {public static void main(String[] args) throws IOException {//创建ServerSocket对象ServerSocket ss = new ServerSocket(10086);//等待客户端连接Socket accept = ss.accept();//读取数据InputStreamReader isr = new InputStreamReader(accept.getInputStream());int b;while ((b = isr.read()) != -1){System.out.print((char) b);}//释放资源ss.close();}
}

运行以上代码,打开浏览器,输入回环地址127.0.0.1加端口号
在这里插入图片描述
如图,idea控制台就会出现相应的信息。

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

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

相关文章

Java疫苗接种管理系统

本系统lw为2024-3-21本人原创&#xff0c;查chong13% 1.3W字&#xff0c;可以直接上交&#xff0c;这并不是乱七八糟的技术文档和项目文档。 4.2 功能结构设计 可视化的疫苗接种管理系统功能结构设计主要包括以下几个模块&#xff1a; 登录注册模块&#xff1a;这个模块负责…

浅浅迈入C++门槛

从今天起&#xff0c;我要开始hello&#xff0c;world。 往后更要做到&#xff0c;拳打数据结构&#xff0c;脚踢Linux。 这就是江湖人的风范。 拼搏百天&#xff0c;我要学希普拉斯普拉斯。 C是在C的基础之上&#xff0c;容纳进去了面向对象编程思想&#xff0c;并增加了许…

echarts实践总结(常用二):折线图(特点:渐变、面积区域)

目录 第一章 echarts基本使用 第二章 echarts实践——折线图 效果展示 第一章 echarts基本使用 Echarts常用配置项(详细入门)_echarts配置项手册-CSDN博客 柱状图案例&#xff1a; echarts实践总结(常用一)&#xff1a;柱状图&#xff08;特点&#xff1a;渐变色、点击缩放、…

vue3父子通信、跨层通信

子传父 通过 ref标识 获取真实的 dom对象或者组件实例对象 父组件获取子组件内部属性和方法 顶层组件向任意的底层组件传递数据和方法&#xff0c;实现跨层组件通信 非响应式数据父修改不了子的内容 子组件调用父组件方法

【现代C++】范围基于的for循环

现代C中的范围基于的for循环&#xff08;range-based for loop&#xff09;是C11引入的一项特性&#xff0c;旨在简化对容器或范围的迭代过程。这种循环语法不仅使代码更清晰易读&#xff0c;还减少了迭代时的错误。以下是范围基于的for循环的详细介绍&#xff1a; 1. 基本用法…

CTK插件框架学习-源码下载编译(01)

1、编译环境 window11、vs17、Qt5.14.0、cmake3.27.4 2、下载链接 cmake&#xff1a;Index of /files/v3.20 qt&#xff1a;Index of / vs22以前的版本需要登录下载&#xff1a;Visual Studio 较旧的下载 - 2019、2017、2015 和以前的版本 vs22下载&#xff1a;下载 Visu…

Arduino IDE工程代码多文件编程和中文设置

一、esp8266模块信息 二、中英文切换 点击文件( File )–选择首选项( Preference )—选择语言( Language )—选择中文–点击确定( OK ) 三、多文件编程 在Arduino编程中&#xff0c;将代码分割成多个文件是一种很好的做法&#xff0c;特别是项目变得越来越大和复杂时。这样…

Linux 系统是如何收发⽹络包的

Linux 系统是如何收发⽹络包的&#xff1f; ⽹络模型 为了使得多种设备能通过⽹络相互通信&#xff0c;和为了解决各种不同设备在⽹络互联中的兼容性问题&#xff0c;国际标准化组织制定了开放式系统互联通信参考模型&#xff08;Open System Interconnection Reference Mode…

亚马逊云科技:企业如何开启生成式AI之旅?

如果要评选最近两年全球科技行业最热门的细分领域&#xff0c;那么生成式AI绝对会以遥遥领先的票数成为当仁不让的冠军。 然而眼见生成式AI发展得如火如荼&#xff0c;越来越多的企业却陷入了深深的焦虑&#xff1a;应该如何开启生成式AI之旅&#xff1f;又该怎样搭建大模型&am…

对七层代理、四层代理、正向代理、反向代理的认识

一、理解nginx服务代理 Nginx代理有正向和反向代理两种类型&#xff0c;可以基于osi七层模型中的第四层&#xff08;传输层&#xff09;和第七层&#xff08;应用层&#xff09;进行代理 注&#xff1a; nginx 一般支持的是7层代理&#xff0c;支持四层代理一般使用 lvs 或者ha…

Data.olllo:一键去除相同内容数据列!

引言&#xff1a; 在数据处理的舞台上&#xff0c;重复数据常常像调皮的小精灵一样&#xff0c;频繁出现&#xff0c;让人头疼不已。但现在&#xff0c;有了Data.olllo的神奇功能&#xff0c;您可以一键去除相同内容数据列&#xff0c;让数据处理变得轻松愉快&#xff01; 功能…

虹科Pico汽车示波器 | 免拆诊断案例 | 2019 款东风悦达起亚K2车怠速起停系统工作异常

一、故障现象 一辆2019款东风悦达起亚K2车&#xff0c;搭载G4FG发动机&#xff0c;累计行驶里程约为9 400 km。车主反映&#xff0c;行驶至路口停车等红灯时&#xff0c;怠速起停&#xff08;ISG&#xff09;系统自动使发动机熄火&#xff0c;接着组合仪表提示“怠速起停已解除…

某东联盟js逆向

声明: 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01;wx a15018601872 本文章…

mysql无法看到3306端口监听

参考:https://blog.csdn.net/shumeigang/article/details/103902459 mysql> show global variables like ‘port’; 是0 原因是我的my.cnf有话&#xff1a; skip-network 或 注释掉&#xff0c;然后重新启动下数据库&#xff0c;运行netstat -an|grep 3306 就可以看到了

C#非强签名dll搜索顺序

由于不是强签名dll&#xff0c;所以无效考虑全局程序集缓存 (GAC)。 预备工作 新建解决方案ClassLibrary1,新建类库ClassLibrary1,新建控制台程序ShowDllLoc。 利用VS添加引用。 一&#xff0c;利用app.config设置codebase&#xff0c;设置dll的加载路径为&#xff1a;code…

C#探索之路基础篇(1):编程中面向过程、数据、对象的概念辨析

文章目录 C#探索之路基础篇(1)&#xff1a;编程中面向过程、数据、对象的概念辨析1 面向过程编程1.1 概念1.2 示例代码&#xff1a;1.3 使用范围与时机&#xff1a;1.4 注意事项&#xff1a;1.5 通俗讲法 2 面向对象编程2.1 概念2.2 示例代码2.3 使用范围2.4 注意事项2.5 通俗讲…

软考高级:UML定时图概念和例题

作者&#xff1a;明明如月学长&#xff0c; CSDN 博客专家&#xff0c;大厂高级 Java 工程师&#xff0c;《性能优化方法论》作者、《解锁大厂思维&#xff1a;剖析《阿里巴巴Java开发手册》》、《再学经典&#xff1a;《Effective Java》独家解析》专栏作者。 热门文章推荐&am…

KW音乐搜索参数

声明&#xff1a; 本文章中所有内容仅供学习交流&#xff0c;抓包内容、敏感网址、数据接口均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff0c;若有侵权&#xff0c;请联系我立即删除&#xff01; 逆向目标: …

【Git】第一课:Git的介绍

简介 什么是Git? Git是一个开源的分布式版本控制系统&#xff0c;用于跟踪代码的改变和协同开发。它最初由Linus Torvalds为了管理Linux内核开发而创建&#xff0c;现已成为开源软件开发中最流行的版本控制系统&#xff0c;没有之一。Git允许多人同时在不同的分支上工作&…

【leetcode热题】轮转数组

给定一个整数数组 nums&#xff0c;将数组中的元素向右轮转 k 个位置&#xff0c;其中 k 是非负数。 示例 1: 输入: nums [1,2,3,4,5,6,7], k 3 输出: [5,6,7,1,2,3,4] 解释: 向右轮转 1 步: [7,1,2,3,4,5,6] 向右轮转 2 步: [6,7,1,2,3,4,5] 向右轮转 3 步: [5,6,7,1,2,3,4…