当前位置: 首页 > news >正文

【从0开始学习Java | 第20篇】网络编程

在这里插入图片描述

文章目录

  • 初识网络编程🍂
    • 1.什么是网络编程?
    • 2.常见的软件架构及其优缺点👏
    • 网络编程三要素
  • UPD协议使用🥝
    • 发送数据🍋‍🟩
    • 接收数据🍋‍🟩
    • 简易聊天室功能实现
  • UPD的三种通信方式🧾
    • 单播
    • 组播
      • 代码示例
    • 广播
  • TCP通信协议的应用🥝
    • 代码示例
      • 客户端(发送数据)🍋‍🟩
      • 服务端(接收数据)🍋‍🟩
    • TCP协议的三次握手和四次挥手🐦‍🔥
      • 三次握手 --- 确保连接建立
      • 四次挥手 --- 确保连接断开,且数据处理完毕

初识网络编程🍂

1.什么是网络编程?

计算机跟计算机之间通过网络进行数据传输

2.常见的软件架构及其优缺点👏

常见的软件架构:
在这里插入图片描述

两种架构的优缺点:
在这里插入图片描述

网络编程三要素

  1. IP:设备在网络中的地址,是唯一的标识
    在这里插入图片描述
     特殊IP地址:127.0.0.1,也可以是localhost:是回送地址,也称为本地回环地址,即本地IP,永远只会寻找当前所在本机
     跟本节有关的常见的两个CMD命令:ipconfig:查看本机的IP地址、ping:检查网络是否连通
import java.net.InetAddress;
import java.net.UnknownHostException;public class MyInetAddressDemo1 {public static void main(String []args) throws UnknownHostException {// 获取InetAddress的对象//IP的对象 一台电脑的对象InetAddress address = InetAddress.getByName("LAPTOP-NMC3A9R0");  // 填自己电脑的设备名称System.out.println(address);// 获取电脑的名称String name = address.getHostName();System.out.println(name);// 获取电脑的ip地址String ip = address.getHostAddress();System.out.println(ip);}
}
  1. 端口号:应用程序在设备中唯一的标识

由两个字节表示的整数,取值范围:0~65535
其中0~1023之间的端口号用于一些知名的网络服务或应用
我们自己使用1024以上的端口号
注意:一个端口号只能被一个应用程序使用

  1. 协议:数据在网络中传输的规则,常见的协议有:UDP、TCP、http、https、ftp

网络通信协议参考模型:
在这里插入图片描述
UDP协议和TCP协议:
在这里插入图片描述

UPD协议使用🥝

发送数据🍋‍🟩

public class UDP_Send {public static void main(String []args) throws IOException {// 1.创建DataGramSocket对象// 空参:所有可用的端口中随机一个进行使用// 有参:指定端口号进行绑定使用DatagramSocket ds = new DatagramSocket();// 2.打包数据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);// 3.发送数据ds.send(dp);// 4.释放资源ds.close();}
}

接收数据🍋‍🟩

public class UDP_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,0,len));System.out.println("该数据是从"+address+"这台电脑中的"+port+"端口发出的");}
}

简易聊天室功能实现

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.util.Scanner;public class Wechat_Send {public static void main(String[] args) throws IOException {// UDP发送数据:数据来自键盘录入,直到输入的数据是886,发送数据结束DatagramSocket ds = new DatagramSocket();InetAddress address = InetAddress.getByName("127.0.0.1");int port = 10086;String str =  "";Scanner sc = new Scanner(System.in);while (true) {str = sc.nextLine();if(str.equals("886"))break;byte[] bytes = str.getBytes();DatagramPacket dp = new DatagramPacket(bytes, 0, bytes.length, address,port);ds.send(dp);}ds.close();}=========================================================================================import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;public class Wechat_Receive {public static void main(String []args) throws IOException {// UDP接收数据:因为接收端不知道发送端什么时候停止发送,故采用死循环接收DatagramSocket ds = new DatagramSocket(10086);byte[] bytes = new byte[1024];DatagramPacket dp = new DatagramPacket(bytes,bytes.length);byte[] data = new byte[1024];while(true){ds.receive(dp);data = dp.getData();String name = dp.getAddress().getHostName();int len = dp.getLength();int port = dp.getPort();System.out.println("收到来自电脑"+name+"的"+port+"端口的消息:"+new String(data,0,len));}}

UPD的三种通信方式🧾

单播

在这里插入图片描述

上面所写的代码就是单播

组播

在这里插入图片描述

组播地址:224.0.0.0 ~ 239.255.255.255
其中,224.0.0.0 ~ 224.0.0.255为预留的组播地址

代码示例

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;public class MulticastSocket_Send {public static void main(String []args) throws IOException {// 创建MulticastSocket对象【组播端发送数据】MulticastSocket ms = new MulticastSocket();String s = "你好啊";byte[] bytes = s.getBytes();// 注意,这里的组播地址的使用应为224开头的InetAddress address = InetAddress.getByName("224.0.0.1");int port = 10000;DatagramPacket dp = new DatagramPacket (bytes,bytes.length,address,port);ms.send(dp);ms.close();}
}==================================================================================================import java.io.IOException;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;public class MulticastSocket_Receive {public static void main(String []args) throws IOException {// 组播端接收数据// 1. 创建MulticastSocket对象MulticastSocket ms = new MulticastSocket(10000);//  2. 将当前本机,添加到224.0.0.1的这一组中  !!!!!InetAddress address = InetAddress.getByName("224.0.0.1");ms.joinGroup(address);// 3. 创建DatagramPacket数据包对象byte[] bytes = new byte[1024];DatagramPacket dp = new DatagramPacket(bytes,bytes.length);// 4.接收数据ms.receive(dp);// 5.解析数据byte[] data = dp.getData();int len = dp.getLength();String ip = dp.getAddress().getHostAddress();String name = dp.getAddress().getHostName();System.out.println("收到ip为"+ip+",主机名为"+name+"发送的数据:"+new String(data,0,len));ms.close();}
}

广播

在这里插入图片描述

广播地址:255.255.255.255

代码跟单播的差不多,我们只要把InetAddress address = InetAddress.getByName("224.0.0.1");这部分的地址改为255.255.255.255就是广播了

TCP通信协议的应用🥝

TCP通信程序示意图:
在这里插入图片描述

代码示例

客户端(发送数据)🍋‍🟩

import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;public class A_TCP_Client {public static void main(String []args) throws IOException {// TCP协议,发送数据// 1. 创建Socket对象// 细节:在创建对象的同时会连接服务器,如果连接不上,代码会报错(TCP的特性)Socket socket = new Socket("127.0.0.1",10086);// 2. 从连接通道中获取输出流OutputStream os = socket.getOutputStream();// 写入数据os.write("你好啊林七夜".getBytes());// 3. 释放资源os.close();socket.close();}
}

服务端(接收数据)🍋‍🟩

import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;public class A_TCP_Server {public static void main(String []args) throws IOException {// TCP协议,接收数据// 1.创建对象ServerSockerServerSocket ss = new ServerSocket (10086);// 2. 监听客户端的链接Socket socket = ss.accept();// 3. 从连接通道中获取输入流读取数据InputStream is = socket.getInputStream();// 转换为字符流,防止中文乱码InputStreamReader isr = new InputStreamReader(is);int b;while((b=isr.read())!=-1){System.out.print((char)b);}// 4. 释放资源socket.close();ss.close();}
}

TCP协议的三次握手和四次挥手🐦‍🔥

三次握手 — 确保连接建立

在这里插入图片描述

四次挥手 — 确保连接断开,且数据处理完毕

在这里插入图片描述


如果我的内容对你有帮助,请 点赞 评论 收藏 。创作不易,大家的支持就是我坚持下去的动力!

在这里插入图片描述

http://www.dtcms.com/a/482058.html

相关文章:

  • PetaLinux 工程迁移指南
  • Java面试实战:互联网医疗场景中的JVM调优与Spring Boot应用
  • http环境实现通知
  • 分布式雷达 vs 多基地雷达:同频共振的“合唱团”和“乐队”
  • 手机端-adb脚本自动化-真机版
  • Python爬虫常见陷阱:Ajax动态生成内容的URL去重与数据拼接
  • 简繁英3合1企业网站生成管理系统V1.6wordpress如何降级
  • 【学以致用|python自动化办公】OCR批量识别自动存为Excel(批量识别发票)
  • AJAX 实时搜索
  • 详细介绍C++中通过OLE操作excel时,一般会出现哪些异常,这些异常的原因是什么,如何来解决这些异常
  • ES6知识点详解和应用场景
  • 网站平台建设可行性c 网站开发项目教程
  • Webpack 核心知识点详解:proxy、热更新、Loader与Plugin全解析
  • 本地搭建 Jekyll 环境
  • 前端基础之《React(1)—webpack简介》
  • 攻击者利用Discord Webhook通过npm、PyPI和Ruby软件包构建隐蔽C2通道
  • [Spark] Metrics收集流程
  • pyspark并行性能提升经验
  • HTML盒子模型详解
  • 个人电脑做网站违法吗东莞市住建局官网
  • 下载selenium-ide及使用
  • [Spark] 事件总线机制
  • 长春建站公众号wordpress4.7中文主题
  • 6.string的模拟实现(三)
  • AQS 为什么采用抽象类(abstract class)而不是接口(interface)实现?
  • stable-diffusion-webui / stable-diffusion-webui-forge部署
  • 阿里云和聚名网的域名注册安全性如何?
  • 别让链表兜圈子——力扣141.环形链表
  • 济南网站推广公司做二手网站的用意
  • 专业的汽车媒体发稿怎么选