Java中的网络编程

文章目录

    • 网络基础知识
      • IP 地址
      • 端口
      • 协议
    • Java 中网络编程
      • InetAddress(静态类)
      • UDP 通信原理
        • UDP 发送数据步骤
        • UDP 接收数据步骤
        • UDP 发送接收案例
      • TCP 通信原理
        • TCP 发送数据步骤
        • TCP 接收数据步骤
        • TCP 发送接收案例

网络基础知识

  • 概述:在网络通信协议下(http/tcp/udp)实现网络互连的不同计算机上运行的程序间可以进行数据交换。

  • 网络编程中的三要素:

    名字作用
    IP 地址网络中设备的唯一标识
    端口应用程序的标识
    协议对数据的传输格式、传输速率、传输步骤做了统一的规定,通信双方必须同时遵守才能完成数据交换,常见协议有(TCP UDP)

IP 地址

  • 常见的 IP 地址

    • IPV4

      • 给每个连接在网络上的主机分配一个 32 bit (位)的地址,按照 TCP/IP 规定,IP 地址使用二进制表示,每个 IP 地址 32bit ,也就是 4 个字节(1字节=8位)

      • 十进制形式(点分十进制表示法):192.168.1.66

      • 二进制表示形式: 11000000.10101000.00000001.01000010

    • IPV6

      • 采用 128 bit , 16个字节一组,分成 8 组十六进制数据,解决了网络地址资源数量不够的问题。
  • 关于IP的一些命令(命令运行框使用)

    命令作用
    ipconfig查看本机IP地址
    ping IP 地址检查网络是否连通
  • 特殊的 IP 地址

    • 127.0.0.1 回送地址,可以代表本机地址,常用来测试
    • 例如(本地地址):
      • 127.0.0.1/demo/login.html
      • localhost/demo/login.html

端口

  • 端口号
    • 用两个字节表示的整数,它的取值范围是0~65535
    • 其中0~1023之间的端口号用于一些知名的网络服务和应用
    • 普通应用程序需使用1024以上的端口号,如果端口号被占用,会导致当前程序启动失败

协议

  • UDP协议

    1、用户数据报协议(User Datagram Protocol)
    2、UDP是无连接通信协议,发送端和接收端不会建立逻辑连接
    3、由于UDP协议消耗资源小,通信效率高,所以通常都会用于音频、视频、普通数据的传输
    4、由于UDP的面向无连接性,不能保证数据的完整性,因此传输重要数据不建议使用
  • TCP协议

    1、传输控制协议(Transmission Control Protocol)
    2、TCP协议是面向连接的通信协议,传输数据前,发送端和接收端建立逻辑连接,然后再传输数据
    3、提供两台计算机之间可靠无差错的数据传输,TCP中必须明确客户端与服务器端,三次握手
    4、保证数据传输的安全,上传文件,下载文件,浏览网页等
    5、三次握手:TCP协议中,在发送数据的准备阶段,客户端和服务器之间的三次交互,以保证可靠连接


Java 中网络编程

InetAddress(静态类)

  • 概述:为了方便我们对IP地址的获取和操作,Java提供了一个类 InetAddress 供我们使用。InetAddress : 表示Internet协议(IP)地址

  • 常用方法

    方法作用
    static InetAddress getByName(String host)确定主机名称的IP地址。
    主机名称可以是机器名称,也可以是IP地址
    String getHostName()获取此IP地址的主机名
    String getHostAddress()返回文本显示中的IP地址字符串
  • 代码演示

    • 首先 win + r ,输入 cmd 打开命令运行框

    • 输入 ipconfig,找到 IPV4 地址(红框圈住的就是主机名称)

    public class Test {public static void main(String[] args) throws UnknownHostException {// 使用 InetAddress类,调用方法,获取本机对象InetAddress lh = InetAddress.getByName("xiaoHeng");// 调用方法,获取此IP地址的主机名String hostName = lh.getHostName();// 调用方法,返回文本显示中的IP地址字符串String hostAddress = lh.getHostAddress();System.out.println("本机名称是:" + hostName);System.out.println("本机地址是:" + hostAddress);}
    }
    

    注意:代码演示的,换成自己主机名后,输出的 本地地址,就和 命令运行框 查看的 IPV4 地址一致


UDP 通信原理

  • 概述:UDP是一种不可靠的网络协议,它在通信两端各建立一个 Socket 对象,但是这两个 Socket 只是发送,接收数据的对象
  • DatagramSocket 基于UDP协议的Socket
UDP 发送数据步骤
  1. 创建发送端的 Socket 对象(DatagramSocket)

    DatagramSocket ds = new DatagramSocket();
    
  2. 创建数据,并把数据打包

    byte[] bys = "你好".getBytes();				// 将字符串转换成 字节数组
    DatagramPacket dp = new DatagramPacket(bys,bys.length,InetAddress.getByName("ip"),int port);
    
  3. 调用 DatagramSocket 对象的方法发送数据

    void send(DatagramPacket p);
    
  4. 关闭发送端

    void close();
    
UDP 接收数据步骤
  1. 创建接收端的 Socket 对象(DatagramSocket)

    DatagramSocket(int port);						// 根据端口号
    
  2. 创建一个数据包,用于接收数据

    DatagramPacket(byte[] bys , int length);
    
  3. 调用 DatagramSocket 对象方法接收数据

    void receive(DatagramPacket dp);
    
  4. 解析数据包,并展示在控制台

    byte[] getData();											// 数据缓冲区
    int getLength();											// 实际数据长度
    String s = new String(dp.getData(),0,dp.getLength());		// 转换成字符串
    
  5. 关闭接收端

    void close();
    
UDP 发送接收案例
  • 使用 UDP 协议,发送 “你好,世界!你好,中国!”,用接收端接收,并展示在控制台上?

    • 发送端(再开启服务端)
    // 发送端
    public class Client {public static void main(String[] args) throws IOException {// 1、创建发送端的 Socket 对象DatagramSocket ds = new DatagramSocket();// 2、创建数据,并将数据打包byte[] bys = "你好,世界!你好,中国!".getBytes();DatagramPacket dp = new DatagramPacket(bys, bys.length, InetAddress.getByName("127.0.0.1"), 8080);// 3、调用 DatagramSocket 对象发送数据ds.send(dp);// 4、关闭发送端ds.close();}
    }
    
    • 接收端(先开启接收端)
    // 接收端
    public class Server {public static void main(String[] args) throws IOException {// 1、创建接收端的 Socket 对象DatagramSocket ds = new DatagramSocket(8080);// 2、创建一个数据包,用于接收数据byte[] bys = new byte[1024];DatagramPacket dp = new DatagramPacket(bys , bys.length);// 3、调用 DatagramSocket 对象方法接收数据ds.receive(dp);// 4、解析数据包,并展示在控制台byte[] data = dp.getData();int length = dp.getLength();String s = new String(data ,0,length);System.out.println(s);// 5、关闭接收端ds.close();}
    }
    

TCP 通信原理

  • 概述:TCP可靠的网络协议,在通信两端各建立一个Socket对象,从而在通信的两端形成网络虚拟链路,一旦建立了虚拟的网络链路,两端的程序就可以通过虚拟链路进行通信

  • Java为客户端提供了Socket类,为服务器端提供了ServerSocket类

  • Java对基于TCP协议的网络提供了良好的封装,使用Socket对象来代表两端的通信端口,并通过Socket产生IO流来进行网络通信

TCP 发送数据步骤
  1. 创建客户端 Socket 对象(Socket)

    Socket(String host , int port);				// host:主机号 port:端口号
    
  2. 获取输出流,写数据

    OutputStream getOutputStream();
    
  3. 释放资源

    void close();
    
TCP 接收数据步骤
  1. 创建服务器端的Socket对象(ServerSocket)

    ServerSocket(int port);
    
  2. 监听客户端连接,返回一个 Socket 对象

    Socket accept();
    
  3. 获取输入流,读数据,并把数据显示在控制台上

    InputStream getInputStream();
    
  4. 释放资源

    void close();
    
TCP 发送接收案例
  • 使用 TCP 协议,建立客户端和服务端连接,在客户端使用键盘输入随机文字,显示在服务端控台上?IO 流可参考这篇文章

    • 服务端(接收数据,先打开服务端)
    public class Server {public static void main(String[] args) throws IOException {// 1、创建服务器端对象(端口号,随意)ServerSocket ss = new ServerSocket(8080);// 2、监听客户端连接Socket a = ss.accept();// 3、获取输入流,读数据,将数据展示在控制台上InputStream is = a.getInputStream();byte[] bys = new byte[1024];int len;while((len = is.read(bys)) != -1){System.out.println(new String(bys,0,len));}// 4、释放资源ss.close();}
    }
    
    • 客户端(发送数据,再打开客户端)
    public class Client {public static void main(String[] args) throws IOException {// 1、创建客户端 对象Socket s = new Socket("127.0.0.1",8080);// 2、获取输出流,写数据OutputStream os = s.getOutputStream();// 3、创建键盘输入对象Scanner sc = new Scanner(System.in);System.out.print("请输入你想要发送的内容:");String data = sc.next();// 4、利用输出流写数据os.write(data.getBytes());// 5、释放资源s.close();}
    }
    
    • 运行结果


欢迎大家留言,一起进入编程世界!

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

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

相关文章

vue3 +TS 安装使用router路由模块

一.安装 1.下载安装依赖 npm install vue-routernextnpm install types/vue-router2.router目录创建 在src 目录下 创建 /src/router文件夹 包含两个文件 route.ts import { RouteRecordRaw } from vue-routerconst routes: Array<RouteRecordRaw> [{path: /,name:…

尚硅谷大数据技术-数据湖Hudi视频教程-笔记01【概述、编译安装】

大数据新风口&#xff1a;Hudi数据湖&#xff08;尚硅谷&Apache Hudi联合出品&#xff09; B站直达&#xff1a;https://www.bilibili.com/video/BV1ue4y1i7na 尚硅谷数据湖Hudi视频教程百度网盘&#xff1a;https://pan.baidu.com/s/1NkPku5Pp-l0gfgoo63hR-Q?pwdyyds阿里…

Kubernetes复习总结(二):Kubernetes容器网络

2、Kubernetes容器网络 1&#xff09;、Docker网络原理 Docker默认使用的网络模型是bridge&#xff0c;这里只讲bridge网络模型 1&#xff09;容器之间通信原理 当安装完docker之后&#xff0c;docker会在宿主机上创建一个名叫docker0的网桥&#xff0c;默认IP是172.17.0.1…

Tensorflow2.0笔记 - 创建tensor

tensor创建可以基于numpy&#xff0c;list或者tensorflow本身的API。 笔记直接上代码&#xff1a; import tensorflow as tf import numpy as np import matplotlib.pyplot as plttf.__version__#通过numpy创建tensor tensor0 tf.convert_to_tensor(np.ones([2,3])) print(te…

Java程序员面试-场景篇

前言 裁员增效潮滚滚而来&#xff0c;特总结一些实际场景方案的面试题&#xff0c;希望对大家找工作有一些帮助。 注册中心 题目&#xff1a; 有三台机器&#xff0c;分别部署了微服务A、微服务B、注册中心&#xff0c;其中A和B都有服务接口提供并正常注册到了注册中心&…

H264/AVC的句法和语义

概述 码流的基本单位&#xff1a; 在编码器输出的码流中&#xff0c;数据的基本单位是句法元素&#xff0c;每个句法元素由若干比特组成&#xff0c;它表示某个特定的物理意义 &#xff0c;比如宏块类型、量化参数等。 句法&#xff1a;句法表征句法元素的组织结构。 语义&a…

【Spring Cloud】Gateway组件的三种使用方式

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是Java方文山&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的专栏《Spring Cloud》。&#x1f3af;&#x1f3af; &am…

小梅哥Xilinx FPGA学习笔记22——ip核之FIFO

目录 一&#xff1a;章节说明 1.1 FIFO IP简介 1.2 FIFO Generato IP 核信号框图 1.3 实验任务 二&#xff1a;FIFO 写模块设计 2.1 简介 2.2 模块框图 2.3 模块端口与功能描述 2.4 写模块代码 三 FIFO 读模块设计 3.1 简介 3.2 模块框图 3.3 模块端口与功…

【OpenCV学习笔记04】- 绘图功能

内容 用 OpenCV 画不同的几何图形学习这些函数&#xff1a;cv.line(), cv.circle() , cv.rectangle(), cv.ellipse(), cv.putText() 等。 函数常用传参 在上述所有功能中&#xff0c;您将看到一些常见的参数&#xff0c;如下所示&#xff1a; img&#xff1a;您要绘制形状的…

“程序员面试之道:成为求职战场上的不可忽视的力量“

文章目录 每日一句正能量前言面试经历面试技巧后记 每日一句正能量 看淡拥有&#xff0c;不刻意追求某些东西&#xff0c;落叶归根&#xff0c;那些属于你的&#xff0c;总会回来。 前言 在现代科技发展日新月异的时代&#xff0c;程序员无疑扮演着重要的角色。他们是代码的创…

非常漂亮的外贸网站完整代码,适合机械加工和金属零件等领域。

非常漂亮的外贸网站完整代码&#xff0c;适合机械加工和金属零件等领域。整站代码&#xff0c;上传到服务器虚拟主机即可使用。 独家原创资源。源码是asp开发的&#xff0c;数据库是access&#xff0c;主流的虚拟主机空间都支持asp&#xff0c;直接上传就可以使用。 站长保证…

Transformers 2023年度回顾 :从BERT到GPT4

人工智能已成为近年来最受关注的话题之一&#xff0c;由于神经网络的发展&#xff0c;曾经被认为纯粹是科幻小说中的服务现在正在成为现实。从对话代理到媒体内容生成&#xff0c;人工智能正在改变我们与技术互动的方式。特别是机器学习 (ML) 模型在自然语言处理 (NLP) 领域取得…