第二十一章Java网络通信

网络通信这一章  基本分为三个部分  网络基础概念和TCP,UDP这三个部分主要如下:

6170263e430f4306a2867347c5f4dff5.png计算机网络实现了堕胎计算机间的互联,使得它们彼此之间能够进行数据交流。网络应用程序就是再已连接的不同计算机上运行的程序,这些程序借助于网络协议,相互之间可以交换数据,编写网络应用程序前,首先必须明确网络协议TCP/IP协议是网络应用程序的首选

网络程序设计基础:

网络程序设计编写始于其他计算机进行通信的程序,java已经将网络程序所需要而定元素封装成不同的类,用户只要床啊金这些类的对象,使用相应的方法即使不举报相关的网络知识,也是可以编写除高质量的网络通信程序的,

本章最主要的是TCP和UDP两个部分  他们两主要的区别就是一个是一对一通信  一个是一对多通信   当然两者都有各自的优势和劣势,接下来先讲解 TCP部分
TCP程序

TCP程序的通信方式呢 是一对一的   步骤是  先要打开服务器然后客户端连接服务器  先是尝试客户端是否能够接收到信息  如果可以接收到信息的话  这时服务器将会把文件传输给客户端,这样的话 能够保证客户端可以接收到信息  ,劣势呢就是每次都是要这样子 所以效率对比起UDP来说慢下了好多  以下代码将会进行讲解

客户端代码:

 
  1. package tcp;

  2.  
  3. import java.io.*;

  4. import java.net.Socket;

  5. import java.util.Scanner;

  6.  
  7. /**

  8. * Socket客户端

  9. **/

  10. public class SocketClient {

  11. public static void main(String[] args) {

  12. Socket s = null;

  13. try {

  14. // 与ip为127.0.0.1、端口为12345的服务端建立连接

  15. s = new Socket("127.0.0.1", 12345);

  16.  
  17. // 创建输入流接收服务端发送的消息(字节流)

  18. InputStream is = s.getInputStream();

  19. // 将服务端返回的字节流转化为字符流

  20. InputStreamReader isr = new InputStreamReader(is);

  21. // 创建字符流读取缓冲区,方便每行读取

  22. BufferedReader br = new BufferedReader(isr);

  23.  
  24. // 创建输出流返回消息

  25. OutputStream os = s.getOutputStream();

  26. // 创建输出流缓冲

  27. PrintWriter pw = new PrintWriter(os);

  28.  
  29. // 创建发送消息的线程

  30. Runnable rOut = () -> {

  31. boolean flag = true;

  32. while (flag) {

  33. try {

  34. // 接收控制台输入

  35. Scanner scan = new Scanner(System.in);

  36. String msg = scan.nextLine();

  37. // 将输入写入缓冲

  38. pw.println(msg);

  39. // 将缓冲内的数据推送至服务端并清空缓冲区

  40. pw.flush();

  41. } catch (Exception e) {

  42. flag = false;

  43. e.printStackTrace();

  44. }

  45. }

  46. };

  47.  
  48. // 创建接收消息的线程

  49. Runnable rIn = () -> {

  50. boolean flag = true;

  51. while (flag) {

  52. try {

  53. // 逐行读取服务端返回的消息并打印

  54. String str = br.readLine();

  55. System.out.println("服务端的消息:" + str);

  56. } catch (IOException e) {

  57. flag = false;

  58. e.printStackTrace();

  59. }

  60. }

  61. };

  62.  
  63. // 启动两个线程

  64. Thread tOut = new Thread(rOut);

  65. Thread tIn = new Thread(rIn);

  66. tOut.start();

  67. tIn.start();

  68. }catch (IOException e) {

  69. try {

  70. // 释放资源

  71. s.close();

  72. } catch (Exception exception) {

  73. exception.printStackTrace();

  74. }

  75. e.printStackTrace();

  76. }

  77. }

  78. }

 服务端代码:

 
  1. package tcp;

  2. import java.io.*;

  3. import java.net.ServerSocket;

  4. import java.net.Socket;

  5. import java.util.Scanner;

  6.  
  7. /**

  8. * Socket服务端

  9. **/

  10. public class SocketServer {

  11. public static void main(String[] args) {

  12. ServerSocket ss = null;

  13. Socket s = null;

  14. try {

  15. // 创建监听端口为12345的Socket服务端

  16. ss = new ServerSocket(12345);

  17. System.out.println("服务端Socket服务已建立,等待客户端连接...");

  18. // 通过ss.accept()开始持续监听12345端口,当有连接时获取收到的包装成Socket的客户端对象

  19. s = ss.accept();

  20. // 获取客户端的IP地址和端口号

  21. String ip = s.getInetAddress().getHostAddress();

  22. int port = s.getPort();

  23. System.out.println("服务端与 " + ip + ":" + port + " 已建立连接");

  24.  
  25. // 创建输入流接收客户端发送的消息(字节流)

  26. InputStream is = s.getInputStream();

  27. // 将客户端发送的字节流转化为字符流

  28. InputStreamReader isr = new InputStreamReader(is);

  29. // 创建字符流读取缓冲区,方便每行读取

  30. BufferedReader br = new BufferedReader(isr);

  31.  
  32. // 创建输出流返回消息

  33. OutputStream os = s.getOutputStream();

  34. // 创建输出流缓冲

  35. PrintWriter pw = new PrintWriter(os);

  36.  
  37. // 创建接受信息的线程

  38. Runnable rIn = () -> {

  39. boolean flag = true;

  40. while (flag) {

  41. try {

  42. // 逐行读取客户端发送的消息并打印

  43. String str = br.readLine();

  44. System.out.println("客户端的消息:" + str);

  45. } catch (IOException e) {

  46. flag = false;

  47. e.printStackTrace();

  48. }

  49. }

  50. };

  51.  
  52. // 创建发送消息的线程

  53. Runnable rOut = () -> {

  54. boolean flag = true;

  55. while (flag) {

  56. try {

  57. // 接收控制台输入

  58. Scanner scan = new Scanner(System.in);

  59. String msg = scan.nextLine();

  60. // 将输入写入缓冲

  61. pw.println(msg);

  62. // 将缓冲内的数据推送至客户端并清空缓冲区

  63. pw.flush();

  64. } catch (Exception e) {

  65. flag = false;

  66. e.printStackTrace();

  67. }

  68. }

  69. };

  70.  
  71. // 开启两个线程

  72. Thread tIn = new Thread(rIn);

  73. Thread tOut = new Thread(rOut);

  74. tIn.start();

  75. tOut.start();

  76. } catch (IOException e) {

  77. try {

  78. // 释放资源

  79. ss.close();

  80. s.close();

  81. } catch (Exception exception) {

  82. exception.printStackTrace();

  83. }

  84. e.printStackTrace();

  85. }

  86. }

  87. }

 代码图如下:

6211f267abfd4a728439360de8e485b8.pngf352813be7b54d6db5ddd278e265edea.png

运行结果如下所示:

 24849969072a4756bc28724ef692522c.png

 接下来讲解UDP程序

UDP程序

UDP程序跟TCP程序不同的地方呢  TCP通信是一对一通信 如果要一下通知好多个人的话 就需要一个一个来通信  所以这时将会需要UDP了  UDP的优势就在于效率高 但是不稳定的地方呢  就是效率高但是不一定每个人都能看到  就像老师在台上讲课 总有一些学生会在台下玩手机 或者带耳机  不一定每一个人都能够接受得到  这就是UDP的不稳定的地方 ,接下来使用代码来讲解:

广播类代码如下:

 
  1. package udp;

  2.  
  3. import java.io.IOException;

  4. import java.net.DatagramPacket;

  5. import java.net.InetAddress;

  6. import java.net.MulticastSocket;

  7. //广播 先运行

  8. public class Notification extends Thread{

  9. String weather = "节目预报:八点有大型晚会,请收听";//发送消息

  10. int port = 9898;//端口号

  11. InetAddress iaddress = null;

  12. MulticastSocket socket = null;//多点广播套接字

  13.  
  14. Notification(){

  15. try {

  16. iaddress = InetAddress.getByName("224.255.10.0");//地址

  17. socket = new MulticastSocket(port);//实例化多点广播套接字

  18. socket.setTimeToLive(1);//指定发送范围是本地网络

  19. socket.joinGroup(iaddress);//加入广播组

  20. }catch(IOException e){

  21. e.printStackTrace();//输出异常信息

  22. }

  23.  
  24. }

  25. public void run(){//run方法

  26. while(true) {

  27. DatagramPacket packet = null;//数据包

  28. byte data[]=weather.getBytes();//字符串消息的字节数组

  29. packet = new DatagramPacket(data,data.length,iaddress,port);//将数据打包

  30. System.out.println(weather);//控制台打印消息

  31. try {

  32. socket.send(packet);//发送数据

  33. sleep(3000);//让线程休眠3000毫秒

  34. }catch(IOException e){

  35. e.printStackTrace();

  36. }catch(InterruptedException e) {

  37. e.printStackTrace();

  38. }

  39. }

  40. }

  41. public static void main(String[]args) {

  42. Notification w =new Notification();

  43. w.start();//启动线程

  44. }

  45. }

接收类代码如下:

 
  1. package udp;

  2.  
  3. import java.awt.BorderLayout;

  4. import java.awt.Color;

  5. import java.awt.GridLayout;

  6. import java.awt.event.ActionEvent;

  7. import java.awt.event.ActionListener;

  8. import java.io.IOException;

  9. import java.net.DatagramPacket;

  10. import java.net.InetAddress;

  11. import java.net.MulticastSocket;

  12.  
  13. import javax.swing.JButton;

  14. import javax.swing.JFrame;

  15. import javax.swing.JPanel;

  16. import javax.swing.JTextArea;

  17. import javax.swing.WindowConstants;

  18. //接收 后运行

  19. public class Receive extends JFrame implements Runnable, ActionListener {

  20. int port ;//端口

  21. InetAddress group =null;//广播组地址

  22. MulticastSocket socket = null;//多点广播套接字对象

  23. JButton inceBtn = new JButton("开始接收");

  24. JButton stopBtn = new JButton("停止接收");

  25. JTextArea inceAr = new JTextArea(10,10);//显示接收广播的文本域

  26. JTextArea inced = new JTextArea(10,10);

  27. Thread thread ;

  28. boolean stop = false;//定制接受信息状态

  29.  
  30. public Receive () {

  31. setTitle("广播数据包");

  32. setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

  33. thread = new Thread(this);

  34. inceBtn.addActionListener(this);//绑定按钮ince的单击事件

  35. stopBtn.addActionListener(this);//绑定按钮stop的单击事件

  36. inceAr.setForeground(Color.blue);//指定文本域中文字的颜色

  37.  
  38. JPanel north = new JPanel();

  39. north.add(inceBtn);//将按钮添加到面板north上

  40. north.add(stopBtn);

  41. add(north,BorderLayout.NORTH);//将north放置在窗体的上部

  42. JPanel center = new JPanel();//创建面板对象center

  43. center.setLayout(new GridLayout(1,2));//设置面板布局

  44. center.add(inceAr);//将文本域添加到面板上

  45. center.add(inced);

  46. add(center,BorderLayout.CENTER);//设置面板的布局

  47. validate();//刷新

  48. port =9898;//设置端口号

  49. try {

  50. group = InetAddress.getByName("224.255.10.0");//指定接收地址

  51. socket = new MulticastSocket(port);//绑定多点广播套接字

  52. socket.joinGroup(group);//加入广播组

  53. }catch(IOException e){

  54. e.printStackTrace();//输出异常信息

  55. }

  56. setBounds(100,50,360,380);//设置布局

  57. setVisible(true);//将窗体设置为显示状态

  58. }

  59. public void run() {//run方法

  60. while (!stop) {

  61. byte data[] = new byte[1024];//创建缓存字节数组

  62. DatagramPacket packet = null;

  63. packet = new DatagramPacket(data,data.length,group,port);//待接收的数据包

  64. try {

  65. socket.receive(packet);//接收数据包

  66. //获取数据包中的内容

  67. String message = new String(packet.getData(),0,packet.getLength());

  68. inceAr.setText("正在接收的内容:\n"+message);//将接受内容显示在文本域中

  69. inced.append(message+"\n");//每条信息为一行

  70. }catch(IOException e ) {

  71. e.printStackTrace();//输出异常信息

  72. }

  73.  
  74. }

  75. }

  76. public void actionPerformed(ActionEvent e) {//单机按钮ince出发时间

  77. if(e.getSource()==inceBtn) {

  78. inceBtn.setBackground(Color.red);//设置按钮颜色

  79. stopBtn.setBackground(Color.yellow);

  80. if(!(thread.isAlive())) {//如线程不处于“新建状态”

  81. thread = new Thread(this);//实例化Thread对象

  82. }

  83. thread.start();//启动线程

  84. stop = false;//开始接受信息

  85. }

  86. if(e.getSource()== stopBtn) {//单机按钮stop出发时间

  87. inceBtn.setBackground(Color.yellow);//设置按钮亚瑟

  88. stopBtn.setBackground(Color.red);

  89. stop = true;//停止接收信息

  90. }

  91. }

  92. public static void main(String[]args) {

  93. Receive rec = new Receive();

  94. rec.setSize(460,200);

  95. }

  96. }

代码图如下所示:

5cc1e4ad9965450ea1aa1525baa5be89.pngd68f48201009454e925a777d0f4d7fe7.png运行结果如下所示:

2331a6e0b0874692b09ae175c614c62b.png

 

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

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

相关文章

Github项目推荐:KaTeX

项目地址 GitHub - KaTeX/KaTeX: Fast math typesetting for the web. 项目描述 这是一个渲染公式的JavaScript库。有时候可能网页中需要写一些公式,但html本身并没有提供相应的标签。这个时候这个库就能派上用场了。 项目截图

JVM篇:JVM内存结构

程序计数器 程序计数器英文名叫:Program Counter Register 作用:用来记录下一条jvm指令的地址行号。 先来查看一段jvm指令,这些指令对应的java代码就是输出1-5 操作系统运行该Java程序时具体流程如下 语言解释:源文件通过编译转…

常用的 linux 命令

常用的 linux 命令 1.从其他机器拷贝文件夹2.查看哪个程序在用特定端口3.实时监控日志文件内容4.查看指定用户拥有的进程5.查看磁盘空间使用情况6.文件搜索which(whereis) 显示系统命令所在目录find 查找任何文件或目录1) 根据文件名称查找2)…

MATLAB - 使用 YOLO 和基于 PCA 的目标检测,对 UR5e 的半结构化智能垃圾箱拣选进行 Gazebo 仿真

系列文章目录 前言 本示例展示了在 Gazebo 中使用 Universal Robots UR5e cobot 模拟智能垃圾桶拣选的详细工作流程。本示例提供的 MATLAB 项目包括初始化、数据生成、感知、运动规划和积分器模块(项目文件夹),可创建完整的垃圾桶拣选工作流…

[Angular] 笔记 11:可观察对象(Observable)

chatgpt: 在 Angular 中,Observables 是用于处理异步数据流的重要工具。它们被广泛用于处理从异步操作中获取的数据,比如通过 HTTP 请求获取数据、定时器、用户输入等。Observables 提供了一种机制来订阅这些数据流,并可以在数据到达时执行相…

启明智显开源项目分享|基于Model 3c芯片的86中控面板ZX3D95CM20S-V11项目软硬件全开源

前言: 本文为4寸 480*480 RGB接口IPS全面触屏的86中控面板(RT-ThreadLVGL)软硬件开源干货内容,该项目是综合性非常强的RTOS系列项目!项目主控芯片使用 Model 3c,整体实现了简化版本的86中控面板的功能需求…

git 如何将某个分支的某个提交复制到另外一个分支

请直接去看原文: 原文链接:git 如何将某个分支的某个提交复制到另外一个分支_gitlab里面的markdown文件可以复用其他分支的吗-CSDN博客 --------------------------------------------------------------------------------------------------------------------------------…

深入浅出:分布式、CAP 和 BASE 理论(荣耀典藏版)

大家好,我是月夜枫,一个漂泊江湖多年的 985 非科班程序员,曾混迹于国企、互联网大厂和创业公司的后台开发攻城狮。 在计算机科学领域,分布式系统是一门极具挑战性的研究方向,也是互联网应用中必不可少的优化实践&…

百度每天20%新增代码由AI生成,Comate SaaS服务8000家客户 采纳率超40%

12月28日,由深度学习技术及应用国家工程研究中心主办的WAVE SUMMIT深度学习开发者大会2023在北京召开。百度首席技术官、深度学习技术及应用国家工程研究中心主任王海峰现场公布了飞桨文心五载十届最新生态成果,文心一言最新用户规模破1亿,截…

【数据库系统概论】第6章-关系数据库理论

真别看吧,抄ppt而已啊 文章目录 6.1 引言6.2 规范化6.2.1 函数依赖6.2.2 码6.2.3 范式(Normal Form)6.2.4 BC范式6.2.5 规范化小结 6.1 引言 我们有这样一张表: but 为啥这样设计呢?由此引出怎样设计一个关系数据库…

三维可视化智慧工地源码,数字孪生可视化大屏,微服务架构+Java+Spring Cloud +UniApp +MySql

源码技术说明 微服务架构JavaSpring Cloud UniApp MySql;支持多端展示(PC端、手机端、平板端);数字孪生可视化大屏,一张图掌握项目整体情况;使用轻量化模型,部署三维可视化管理,与一线生产过程相融合&#…

设计模式----解释器模式

一、简介 解释器模式使用频率并不高,通常用来构建一个简单语言的语法解释器,它只在一些非常特定的领域被用到,比如编译器、规则引擎、正则表达式、sql解析等。 解释器模式是行为型设计模式之一,它的原始定义为:用于定义…

自动生成数控加工的轨迹刀具轨迹阿基米德螺旋线(3D)

文章目录 1. 阿基米德螺旋线2. 生成步骤目标: 基于点云自动生成阿基米德螺旋线轨迹点 针对的是半球形模型效果 1. 阿基米德螺旋线 阿基米德螺旋线(Archimedean spiral)是一种数学曲线,由古希腊数学家阿基米德(Archimedes)在公元前225年左右首次研究和描述。这条曲线的方…

GIT如何重新生成ssh密钥过程

GIT如何重新生成ssh密钥过程 一、生成密钥前需要把之前的密钥删除吆 第一步:重新配置用户名和邮箱( Git Bash 或命令窗口) 1、配置用户命令:git config --global user.name “xxxxx” 2、配置邮箱命令:git config …

windows进行udp端口转发,解决项目中服务器收不到组播数据的问题

说明 windows7的netsh interface portproxy命令只支持tcp端口转发 如果要进行udp端口转发可以使用sokit 运行sokit 端口转发(以为tcp作为讲解,udp类似) 选择转发器 输入监听地址(SRC地址)和端口 输入转发地址&am…

springboot整合minio做文件存储

一,minio介绍 MinIO 是一个基于Apache License v2.0开源协议的对象存储服务。它兼容亚马逊S3云存储服务接口,非常适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等,而一个对象文件可以是任意大小&…

微信邀请函怎么做_重塑品牌形象,点燃营销之火

在数字化时代,微信已成为人们生活中不可或缺的一部分。微信邀请函,作为一种新型的邀请方式,不仅具有时尚感,更承载着邀请者的诚意与创意。今天,让我们一起探讨如何为主题撰写一篇关于微信邀请函的1000字营销软文&#…

ES6的一些高级技巧

✨ 专栏介绍 在现代Web开发中,JavaScript已经成为了不可或缺的一部分。它不仅可以为网页增加交互性和动态性,还可以在后端开发中使用Node.js构建高效的服务器端应用程序。作为一种灵活且易学的脚本语言,JavaScript具有广泛的应用场景&#x…

智能优化算法应用:基于人工蜂鸟算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于人工蜂鸟算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于人工蜂鸟算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.人工蜂鸟算法4.实验参数设定5.算法结果6.…

使用VScode通过内网穿透在公网环境下远程连接进行开发

文章目录 前言1、安装OpenSSH2、vscode配置ssh3. 局域网测试连接远程服务器4. 公网远程连接4.1 ubuntu安装cpolar内网穿透4.2 创建隧道映射4.3 测试公网远程连接 5. 配置固定TCP端口地址5.1 保留一个固定TCP端口地址5.2 配置固定TCP端口地址5.3 测试固定公网地址远程 前言 远程…