java网络编程——网络编程概述及UDP/TCP通信编程的实现

前言:

学习到通信了,整理下相关知识点。打好基础,daydayup!!!

网络编程

网络编程指可以让设备中的程序与网络上其他设备中的程序进行数据交互。

基本的通信架构

基本的通信架构有两种形式:CS架构(Client客户端/Server服务端),BS架构(Browser浏览器/Server服务器)。区别在于:CS架构中,程序员需要实现客户端;BS架构中,不需要实现客服端,只需要用户安装浏览器即可。

网络通信三要素

实现网络通信需要实现三要素:1,IP:设备在网络中的地址,是唯一的标识(java中用InetAddress类代表ip);2,端口:应用程序在设备中唯一的标识;3,协议:连接和数据在网络中传输的规则

如何实现两个程序之间的通信

1:首先确认两个程序的ip地址;2:确认程序的端口号;3:确定传输协议

 IP地址

IP(Internet Protocol):全称:互联网协议地址。是分配给上网设备的唯一标志。

IP地址有两种形式:IPv4(32位),IPv6(128位),由于IPv6尚未全面普及,IPv4接近饱和,为了解决这一状况,引入了公网IP和内网IP,公网IP为可以连接互联网的IP地址。内网为局域网IP为内部使用。

:127.0.0.1为回环地址,代表自己

java中使用InetAddress类来代表ip地址

 InetAddress

代表IP地址

常用方法:
名称说明
public static InetAddress getLocalHost()获取本机IP,会以一个inetAddress的对象返回
public static InetAddress getByName(String host)根据ip地址或者域名,返回一个inetAddress对象
public String getHostName()获取该ip地址对象对应的主机名
public String getHostAddress()获取该ip地址对象中的ip地址信息
public boolean isReachable(int timeout)在指定毫秒内,判断主机与该ip对应的主机是否可以连通

示例如下: 

端口

标记计算机设备上的应用程序,被规定为一个16位的二进制,范围是0-65535

 分类:

周知端口:0-1023,被预先定义的知名应用占用(例如:HTTP占用80,FTP占用21)

注册端口:1024-49151,分配给用户进程或某些应用程序

动态端口:49152-65535,之所以称为动态端口,是因为它一般不固定分配某种进程,而是动态分配。

注:我们自己开发的程序一般选择使用注册端口,且一个设备中不能出现两个程序的端口号一样,否则会出错

通信协议

网络上通信的设备,事先规定的连接规则,以及传输数据的规则被称为网络通信协议

 常用的两个通信协议

UDP(User Datagram Protocol):用户数据报协议;

TCP(Transmission Control Protocol):传输控制协议;

UDP协议

特点:无连接,不可靠通信;不事先建立连接,数据按包发送,一包数据包含:自己的IP,程序端口,目标ip,程序端口和数据(一包数据在64KB以内)。发送方不管对方是否在线,数据在中间丢失也不管,如果接受方收到数据也不会返回确认。(一般用于语音通话,视频直播等,通信效率高)

 java运用java.net.DatagramSocket类来实现UDP通信

DatagramSocket

用于创建客户端,服务端

创建方式:
构造器说明
public DatagramSocket()创建客户端的Socket对象,系统随机分配一个端口号
public DatagramSocket(int port)创建服务端的Socket对象,并指定端口号
 常用方法:
方法说明
public void send(DatagramPacket dp)发送数据包
public void receive(DatagramPacket p)使用数据包接受数据
 DatagramPacket

用于创建数据包

 创建方法:
构造器说明
public DatagramPacket(byte[ ]buf,int length,InetAddress address,int port)创建发出去的数据包对象
public DatagramPacket(byte[ ] buf,int length)创建用来接受数据的数据包
常用方法: 
方法说明
public int getlength()获取数据包,实际接收到的字节个数

 示例如下

TCP协议

特点:面向连接,可靠通信。要保证在不可靠的通信上实现可靠的传输。

TCP协议如何实现可靠传输

三次握手建立连接,传输数据时进行确认,四次挥手断开连接

三次握手连接 

在握手连接前需要确保通信双方都是全双工模式(可以同时发送和接收数据)

(图片来源:黑马程序员) 

传输数据确认

 当三次握手连接后,每当发送消息后,都需要收信对象发送反馈,如果发信方在发送消息后没收到收信方的反馈,那么发信方将重新发送消息

 四次挥手断开连接

四次挥手为了确认所有的消息收发完成

 (图片来源:黑马程序员) 

 java使用java.net.Socket类来实现TCP通信

Socket

用于实现客户端

 创建方式:
构造器说明
public Socket(String host,int port)根据指定的服务器ip,端口号请求与服务器建立连接,连接通过,就获得了客户端socket
常用方法: 
方法说明
public OutputStream getOutputStream()获得字节输出流对象
public InputStream getInputStream()获得字节输入流对象
ServerSocket

用于实现服务端

 创建方式:
构造器说明
public ServerSocket(int port)为服务端程序制造接口
常用方法: 
方法说明
public Socket accept()等待客户端的连接请求,一旦与某个客户端成功连接,返回Socket对象

 示例如下:

 

整理结束,撒花!!!

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

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

相关文章

LabVIEW深度学习

目录 一、配置环境1.1、显卡选择1.2、下载显卡驱动1.3、下载并安装Anaconda1.4、配置Anaconda软件包下载服务器1.5、配置虚拟环境tf_gpu1.6、安装vscode1.7、安装tensorflow1.8、下载安装Git1.9、安装TensorFlow Object Detection API框架1.10、安装依赖的python软件包1.11、配…

【C++航海王:追寻罗杰的编程之路】C++的类型转换

目录 1 -> C语言中的类型转换 2 -> 为什么C需要四种类型转换 3 -> C强制类型转换 3.1 -> static_cast 3.2 -> reinterpret_cast 3.3 -> const_cast 3.4 -> dynamic_cast 4 -> RTTI 1 -> C语言中的类型转换 在C语言中,如果赋值运…

Java | Leetcode Java题解之第9题回文数

题目&#xff1a; 题解&#xff1a; class Solution {public boolean isPalindrome(int x) {// 特殊情况&#xff1a;// 如上所述&#xff0c;当 x < 0 时&#xff0c;x 不是回文数。// 同样地&#xff0c;如果数字的最后一位是 0&#xff0c;为了使该数字为回文&#xff0…

一些Java面试题

1、 Java语言有哪些特点 1、简单易学、有丰富的类库 2、面向对象&#xff08;Java最重要的特性&#xff0c;让程序耦合度更低&#xff0c;内聚性更高&#xff09; 3、与平台无关性&#xff08;JVM是Java跨平台使用的根本&#xff09; 4、可靠安全 5、支持多线程 2、面向对象和…

错误:找不到或无法加载主类(vscode的解决方法)

项目场景&#xff1a; 某天&#xff0c;喵某人在敲代码的过程中&#xff0c;点击运行代码&#xff0c;突然显示找不到或无法加载主类。之前创建的java文件都可以正常运行。但新建的java文件无论是什么&#xff0c;点击运行都会显示“错误&#xff1a;找不到或无法加载主类”。 …

初学python记录:力扣1483. 树节点的第 K 个祖先

题目&#xff1a; 给你一棵树&#xff0c;树上有 n 个节点&#xff0c;按从 0 到 n-1 编号。树以父节点数组的形式给出&#xff0c;其中 parent[i] 是节点 i 的父节点。树的根节点是编号为 0 的节点。 树节点的第 k 个祖先节点是从该节点到根节点路径上的第 k 个节点。 实现…

如何解决Redis和数据库的一致性问题?

为了保证Redis和数据库的数据一致性&#xff0c;肯定是要缓存和数据库双写了。 这时候就需要考虑两个问题&#xff1a;是先操作缓存还是先操作数据库&#xff1f;是删除缓存还是更新缓存&#xff1f; 我的建议是优先考虑删除缓存而不是更新缓存&#xff0c;因为删除缓存更加简单…

深度学习理论基础(六)多头注意力机制

目录 一、自定义多头注意力机制1. Scaled Dot-Product Attention2. 多头注意力机制框图&#xff08;1&#xff09;计算公式&#xff08;2&#xff09;具体计算过程&#xff08;3&#xff09;具体代码 二、pytorch中的子注意力机制模块 深度学习中的注意力机制&#xff08;Atten…

数据挖掘实战-基于LSTM算法的HCV检测者分类模型研究

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

VPDN(L2TP、PPTP)

1、虚拟专用拨号网络 远程接入VPN&#xff0c;客户端可以是PC机 技术&#xff1a;L2TP、PPTP 术语&#xff1a;LAC&#xff1a;L2TP的访问集中器 --- 提供用户的接入 LNS&#xff1a;L2TP的网络服务器 --- 提供L2TP服务的服务器 2、技术 1&#xff09;PPTP 点对点隧道…

Mysql启动失败解决过程

报错内容如下&#xff1a; Mar 05 18:40:49 VM-0-12-centos systemd[1]: Failed to start MySQL Server. Mar 05 18:40:49 VM-0-12-centos systemd[1]: Unit mysqld.service entered failed state. Mar 05 18:40:49 VM-0-12-centos systemd[1]: mysqld.service failed. Mar 05…

创建和启动线程

概述 Java语言的JVM允许程序运行多个线程&#xff0c;使用java.lang.Thread类代表线程&#xff0c;所有的线程对象都必须是Thread类或其子类的实例。 Thread类的特性 每个线程都是通过某个特定Thread对象的run()方法来完成操作的&#xff0c;因此把run()方法体称为线程执行体。…