网络编程的基础知识(适合新手)

网络编程

在Java中,网络编程是指使用Java语言进行网络通信的编程技术。这种技术使得位于不同地理位置的计算机能够通过网络进行通信,实现资源共享和信息传递。

一、定义

Java网络编程是Java语言在网络通信方面的应用,它利用Java提供的网络类库和API,通过编写网络程序实现不同计算机之间的通信。Java网络编程涉及许多概念和技术,如IP地址、端口号、套接字(Socket)和通信协议等。

二、用处

Java网络编程在多个领域都有广泛的应用,例如:

  1. Web应用程序:Java网络编程技术被广泛应用于Web应用程序的开发中,如Servlet、JSP等技术都是基于Java网络编程实现的。
  2. 客户端/服务器应用程序:Java网络编程可以实现客户端和服务器之间的通信,使得不同计算机可以共享数据和服务。
  3. 网络游戏:网络游戏需要实时更新和传输数据,Java网络编程技术可以实现这种实时通信,保证游戏的流畅性和互动性。

三、使用方法

在Java中进行网络编程,可以使用Socket和ServerSocket类来实现基于TCP协议的网络通信,也可以使用DatagramSocket和DatagramPacket类来实现基于UDP协议的网络通信。具体使用方法如下:

  1. TCP通信:
  • 创建ServerSocket对象,绑定监听端口;
  • 调用ServerSocket对象的accept()方法,等待客户端连接;
  • 创建一个Socket对象,表示与客户端的连接;
  • 通过Socket对象的getInputStream()和getOutputStream()方法获取输入/输出流,进行数据传输;
  • 关闭连接。
  1. UDP通信:
  • 创建DatagramSocket对象,绑定端口;
  • 创建DatagramPacket对象,封装要发送的数据和接收方的IP地址及端口号;
  • 调用DatagramSocket对象的send()方法发送数据;
  • 调用DatagramSocket对象的receive()方法接收数据;
  • 解析接收到的DatagramPacket对象中的数据;
  • 关闭连接。

四、注意事项

在进行Java网络编程时,需要注意以下几点:

  1. 网络安全:网络通信涉及到数据的安全性和隐私性,因此需要采取适当的安全措施来保护数据。例如,使用加密技术、身份验证和访问控制等。
  2. 异常处理:网络通信过程中可能会出现各种异常情况,如连接中断、数据传输错误等。因此,在编写网络程序时需要添加适当的异常处理代码,以确保程序的稳定性和可靠性。
  3. 性能优化:网络通信涉及到数据传输和处理,因此需要关注程序的性能问题。可以采取一些优化措施来提高程序的性能,如使用缓存、减少数据传输量、优化算法等。
  4. 代码规范:在编写Java网络程序时,需要遵循一定的代码规范,以提高代码的可读性和可维护性。例如,使用恰当的变量名、注释和缩进等。
  5. 测试和调试:在开发过程中,需要进行充分的测试和调试,以确保程序的正确性和稳定性。可以使用一些测试工具和调试工具来帮助发现和解决问题。

网络编程三要素

  • Ip

    • 设备在网络中的地址,是唯一的标识
  • 端口号确定接收数据的软件

    • 应用程序在设备中的唯一的标识
  • 协议确定网络传输的规则

    • 数据在网络中传输的规则

    • 常见的协议有UDP,TCP,http,https,ftp

网络编程的三要素包括IP地址、端口和协议

  1. IP地址:在网络编程中,IP地址用于标识网络中的设备。它是一个由四个8位二进制数(通常用点分十进制表示)组成的地址,如192.168.1.1。IP地址分为网络号和主机号两部分,网络号用于标识设备所处的网络,而主机号则用于标识该网络中的具体设备。通过IP地址,我们可以确定要接收数据的计算机和识别发送的计算机。
  2. 端口:在网络通信中,端口号用于唯一标识设备中的应用程序。端口号的范围是0到65535,其中0到1023是公认端口,用于系统服务,如HTTP(80端口)和FTP(21端口)。1024到49151是注册端口,可以用于用户自定义服务。当数据到达目标设备时,操作系统会根据端口号将数据传递给相应的应用程序进行处理。
  3. 协议:协议是网络编程中的另一个关键要素,它定义了数据在网络中的传输方式、数据格式以及通信双方必须遵循的规则。常见的网络协议包括TCP(传输控制协议)和UDP(用户数据报协议)。TCP协议是面向连接的协议,提供可靠的数据传输服务,适用于对数据传输有较高要求的应用场景,如文件传输和网页浏览。UDP协议则是无连接的协议,传输速度快但可靠性较低,适用于对实时性要求较高但对数据完整性要求不高的应用场景,如视频直播和在线游戏。

常见的cmd命令

127.0.0.1

  • 永远表示本机

ipconfig

  • 查看本机ip地址

ping

  • 检查网络是否畅通

常见的两个协议(UDP TCP)

UDP

  • (User Datagram Protocol),用户数据协议

  • UDP是面向无连接通信协议

  • 速度快,有大小限制,一次最多发送64k,数据不安全,易丢失数据

例子代码1
  • 注意事项:要先运行接收数据的代码,然后再运行发送数据的代码
package com.mohuanan.test02;import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;public class Test02 {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);//3. 拿出里面的数据ds.receive(dp);byte[] data = dp.getData();int len = dp.getLength();int port = dp.getPort();InetAddress address = dp.getAddress();//4. 释放资源ds.close();String string = new String(data,0,len);System.out.println(string);System.out.println("是从"+address+"这台电脑里面传输过来的");System.out.println("端口为: "+port);}
}package com.mohuanan.test02;import java.io.IOException;
import java.net.*;public class Test01 {public static void main(String[] args) throws IOException {//1. 创建DatagramSocket对象DatagramSocket ds = new DatagramSocket();String str = "你好!";byte[] bytes = str.getBytes();InetAddress address = InetAddress.getByName("127.0.0.1");//2. 创建DatagramPacket对象DatagramPacket dp = new DatagramPacket(bytes,bytes.length,address,10086);//3. 将打包好的数据发送ds.send(dp);//4. 释放资源ds.close();}
}
例子代码2(聊天室)
package com.mohuanan.exercise01;import java.io.IOException;
import java.net.*;
import java.util.Scanner;public class SendMessagee {public static void main(String[] args) throws IOException {//1. 创建DatagramSocket对象DatagramSocket ds = new DatagramSocket();//2. 打包数据Scanner sc = new Scanner(System.in);while (true) {System.out.println("请输入您要输入的话: ");String word = sc.nextLine();if(word.equals("886")){break;}byte[] bytes = word.getBytes();InetAddress address = InetAddress.getByName("127.0.0.1");DatagramPacket dp = new DatagramPacket(bytes,bytes.length,address,10086);//3. 发送数据ds.send(dp);}//4. 释放资源ds.close();}
}package com.mohuanan.exercise01;import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;public class ReceiveMessage {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);while (true) {ds.receive(dp);//3. 解析这个包byte[] data = dp.getData();String ip = dp.getAddress().getHostAddress();int len = dp.getLength();int port = dp.getPort();String name = dp.getAddress().getHostName();System.out.println("ip为: "+ip+",主机名为: "+name+"的人,发送了数据"+new String(data,0,len));System.out.println("端口为: "+port);}//while(true)死循环}
}
运行结果

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

三种通信方式

UDP(用户数据报协议)的三种通信方式分别是:

  1. 单播(Unicast):这是点对点的通信方式。当一个UDP客户端需要将数据发送到另一个特定的UDP客户端时,它使用单播模式。在单播模式下,数据报只发送到指定的接收方,确保数据的安全性和准确性。
  2. 广播(Broadcast):广播模式允许一个UDP客户端发送数据报,使得在同一网络范围内的所有其他UDP客户端都能接收到该数据报。这通常用于网络发现协议,其中设备通过广播其存在来让其他设备知道其在线状态。广播地址通常是255.255.255.255。
  3. 组播(Multicast):也称为多播,组播模式允许UDP客户端加入到一个特定的组播IP地址指定的多播组中。当组内的成员向组播地址发送数据报时,组内的所有成员都可以接收到这些数据报。这种方式类似于QQ群的功能,可以实现一对多的通信。

这三种通信方式各有特点,适用于不同的应用场景。单播模式适用于需要确保数据安全和准确性的场景,广播模式适用于需要让网络中的所有设备都知道某个事件或状态的场景,而组播模式则适用于需要实现一对多通信的场景。

TCP

  • (Transmission Contol Protocol)传输控制协议

  • TCP是面向连接的通信协议

  • 速度慢,没有大小的限制,数据安全

综合练习(多发多写)
package com.mohuanan.exercise;import java.io.*;
import java.net.Socket;public class Client {public static void main(String[] args) throws IOException {//客户端//创建Socket的对象Socket socket = new Socket("127.0.0.1", 10005);//读取本地的文件图片BufferedInputStream bis = new BufferedInputStream(new FileInputStream("client\\client01.jpg"));//转化成为缓冲流OutputStream outputStream = socket.getOutputStream();BufferedOutputStream bos = new BufferedOutputStream(outputStream);//开始读取本地的图片byte[] bytes = new byte[1024 * 1];int len;while ((len = bis.read(bytes)) != -1) {bos.write(bytes, 0, len);}//结束标记 为了让服务端停止socket.shutdownOutput();//获取服务端反馈的消息InputStream is = socket.getInputStream();//把读取到的字节流转化成为字符流InputStreamReader isr = new InputStreamReader(is);//使用缓冲流进行快速读取BufferedReader br = new BufferedReader(isr);String result = br.readLine();System.out.println(result);//释放资源socket.close();bis.close();}
}package com.mohuanan.exercise;import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.UUID;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;public class Server {public static void main(String[] args) throws IOException {//服务端//创建ServerSocket的对象ServerSocket ss = new ServerSocket(10005);ThreadPoolExecutor pool = new ThreadPoolExecutor(3,//核心线程数16,//最多线程数60,//空闲的时间TimeUnit.SECONDS,//空闲的时间单位new ArrayBlockingQueue<>(2),//队伍的长度Executors.defaultThreadFactory(),//线程工厂new ThreadPoolExecutor.AbortPolicy()//拒绝策略);//接收连接//返回一个客户端的对象while (true) {Socket accept = ss.accept();//使用线程池pool.submit(new MyRunnable(accept));}//释放资源}
}package com.mohuanan.exercise;import java.io.*;
import java.net.Socket;
import java.util.UUID;public class MyRunnable implements Runnable{Socket accept;public MyRunnable(Socket socket){this.accept = socket;}@Overridepublic void run() {try {//获取客户端的输入流,并把这个字节流使用缓冲流提高效率BufferedInputStream bis = new BufferedInputStream(accept.getInputStream());//将获取到的数据写到本地文件//避免文件名重复String name = UUID.randomUUID().toString().replace("-","");BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("server\\"+name+".jpg"));byte[] bytes = new byte[1024*1];int len;while((len = bis.read(bytes) )!= -1){bos.write(bytes,0,len);}//回写数据OutputStream outputStream = accept.getOutputStream();BufferedWriter bw2 = new BufferedWriter(new OutputStreamWriter(outputStream));bw2.write("上传成功");bw2.newLine();bw2.flush();} catch (IOException e) {throw new RuntimeException(e);} finally {try {accept.close();} catch (IOException e) {throw new RuntimeException(e);}}}
}

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

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

相关文章

重开之数据结构(二刷)

引言: 由于前段时间学习效率不高,导致后面复习前面数据结构没有一个大纲,因此打算重新来学习以下数据结构,期望再次把数据结构学透,并有深刻的印象.并且记录每一次的学习记录 以便于后续复习 二分查找 需求:在有序数组arr内,查找target值 如果找到返回索引位置如果找不到返回…

c++(一)

c&#xff08;一&#xff09; C与C有什么区别命名空间使用 输入输出流引用指针和引用的区别定义拓展 函数重载例子测试函数重载原理 参数默认值什么是参数默认值注意 在c中如何引入c的库动态内存分配new、delete与malloc、free的区别&#xff1f; C与C有什么区别 <1>都是…

Introduction of Internet 计算机网络概述

计算机网络的概念 计算机网络的定义&#xff1a; 多台独立的计算机通过通信线路实现资源共享的计算机系统 计算机网络的组成 资源子网&#xff1a;提供共享的软件资源和硬件资源 通信子网&#xff1a;提供信息交换的网络结点和通信线路 计算机网络类型 按照拓扑排序 星型…

【STM32】计算定时器的溢出

TIM2、3、4、5、12、13、14在APB1上&#xff0c;最大计数频率84M。 TIM1、8、9、10、11在APB2上&#xff0c;最大计数频率168M。 time(arr1)/(prescale1)/Tclk 算出来的是秒 下图使用TIM14 84MHz 那么time33600*25000/8400000010S&#xff0c;10S进入一次中断 中断方式开…

基于STM32+NBIOT(BC26)设计的物联网观赏鱼缸

文章目录 一、前言1.1 项目介绍【1】开发背景【2】项目实现的功能【3】项目模块组成 1.2 设计思路 二、(硬件控制端)硬件选型2.1 STM32开发板2.2 PCB板2.3 USB下载线2.4 NBIOT模块2.5 杜邦线&#xff08;2排&#xff09;2.6 稳压模块2.7 电源插头2.8 水温检测传感器2.9 水质检测…

TiDB学习4:Placement Driver

目录 1. PD架构 2. 路由功能 2. TSO 2.1 TSO 概念 2.2 TSO分配过程 2.3 TSO时间窗口 3. 调度 3.1 信息收集 3.2 生成调度(operator) 3.3 执行调度 4. Label 与高可用 4.1 Label 的配置 5. 小结 1. PD架构 PD是整个TiDB的总控&#xff0c;相当于集群的大脑 PD集成了…

Android 版本与 API level 以及 NDK 版本对应

采用 Android studio 开发 Android app 的时候&#xff0c;需要选择支持的最低 API Level 和使用的 NDK 版本&#xff0c;对应开发 app 的最低 SDK 版本&#xff1a; 在 app 的 build.gradle 文件里&#xff0c;对应于代码如下&#xff1a; 目前各版本的占有率情况如下&#xf…

PaddleSeg训练推理及模型转换全流程

文章目录 1、数据准备1.1 数据标注1.2 数据导出1.3 标签较验1.4 数据集整理1.5 标签可视化 2、 模型训练3、模型验证4、模型推理5、模型导出6、导出文件的推理7、将模型转换成onnx8、使用onnx进行推理 本文记录一下使用paddleseg进行语议分割模型对人体进行分割的使用流程。事实…

jmeter服务器性能监控分析工具ServerAgent教程

ServerAgent介绍&#xff1a;支持监控CPU&#xff0c;memory&#xff0c;磁盘&#xff0c;网络等&#xff0c;和JMeter集成&#xff0c;在JMeter的图形界面中&#xff0c;可以实时看到监控的数据&#xff0c;但是&#xff0c;它只能监控硬件资源使用情况。 不能监控应用服务 S…

MySQL:表的约束

文章目录 0.小知识&#xff0c;数据转化1.空属性(非空约束)2.默认值&#xff08;default&#xff09;3.comment&#xff08;列描述&#xff09;4.zerofill(显示约束)5.primary key(主键约束)6.auto_increment(自增长)7.unique(唯一键)8.foreign key (外键)9.综合表结构的设计 表…

安装qianfan大模型库,报错:ERROR: Command errored out with exit status 1

安装qianfan大模型库&#xff08;pip install qianfan&#xff09;&#xff0c;报错&#xff1a;ERROR: Command errored out with exit status 1 分析错误&#xff0c;是加载 pycryptodome库时导致的 解决&#xff1a; 1、命令行中重新安装&#xff1a;>pip install pycry…

lspci 显示当前设备的PCI总线信息

lspci 显示当前设备的PCI总线信息 lspci 显示当前设备的PCI总线信息显示当前主机的所有PCI总线信息&#xff1a;以数字方式显示PCI厂商和设备代码同时显示数字方式还有设备代码信息以树状结构显示PCI设备的层次关系&#xff1a;更多信息 lspci 显示当前设备的PCI总线信息 lspc…

XXE(XML外部实体注入)

1、XXE原理 XXE&#xff08;XML外部实体注入&#xff0c;XML External Entity) &#xff0c;在应用程序解析XML输入时&#xff0c;当允许引用外部实体时&#xff0c;可构造恶意内容&#xff0c;导致读取任意文件、探测内网端口、攻击内网网站、发起DoS拒绝服务攻击、执行系统命…

01-Linux【准备篇】

一、学Linux的作用&#xff1f; 1.Linux下开发(部署)软件项目 2.Linux运维 二、Linux的强与弱 1.薄弱 个人桌面领域的应用 此领域是传统Linux应用薄弱的环节&#xff0c;近些年随着Ubuntu、fedora等优秀桌面环境的兴起&#xff0c;Linux在个人桌面领域的占有率在慢慢提高…

潮玩宇宙Dapp游戏:密室大逃杀的魅力探索

在潮玩宇宙这片充满创意与激情的虚拟世界中&#xff0c;一款名为“密室大逃杀”的Dapp游戏凭借其独特的玩法和紧张刺激的氛围&#xff0c;迅速成为了玩家们热衷的焦点。这款游戏不仅融合了传统的密室逃脱元素&#xff0c;还巧妙地结合了区块链技术&#xff0c;为玩家带来了全新…

docker不删除容器更改其挂载目录

场景&#xff1a;docker搭建的jenkins通常需要配置很多开发环境&#xff0c;当要更换挂载目录&#xff0c;每次都需要删除容器重新运行&#xff0c;不在挂载目录的环境通常不会保留。 先给一个参考博客docker不删除容器&#xff0c;修改容器挂载或其他_jenkins 修改容器挂载do…

linux中最常用的文件管理命令

linux中最常用的文件管理命令 linux中最常用的文件管理命令最常用的且没有之一的 ls命令格式不加任何参数使用-l显示更多细节使用-t按照时间排序使用-r按照时间逆序使用-S根据文件大小排序 查看庐山真面貌的cat实例 &#xff1a;简单显示内容实例 &#xff1a;显示行号 -n实例 …

React 其他 Hooks

其他 Hooks useRef 可用于获取 DOM 元素 const ScrollRef useRef(null)ScrollRef.current useContext &#xff08;先回顾一下之前的 Context 知识&#xff0c;借用之前 ppt 和源码&#xff09; Hooks 中使用 useContext 来获取 context 的值 // 父组件创建 contextexpor…

20232801 2023-2024-2 《网络攻防实践》实践十一报告

#20232801 2023-2024-2 《网络攻防实践》实践十一报告 1.实践内容 &#xff08;1&#xff09;web浏览器渗透攻击 使用攻击机和Windows靶机进行浏览器渗透攻击实验&#xff0c;体验网页木马构造及实施浏览器攻击的实际过程。 &#xff08;2&#xff09;取证分析实践—网页木马…

抖音运营_抖音推荐算法的机制

目录 一 抖音流量推荐算法机制 二 4大关键指标 三 完播率 1 黄金3秒 2 内容严谨 3 期待感 4 用户痛点 5 通俗易懂 四 转发量 1 分享需求 2 分享快乐 3 共情表达 4 正义传播 五 评论量 1 话题性 2 争议性 3 参与感 4 评论回评 六 点赞量 1 情感共鸣 2 用户喜…