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

news/2024/5/18 12:36:20 标签: udp, tcp/ip, 网络协议

前言:

学习到通信了,整理下相关知识点。打好基础,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.niftyadmin.cn/n/5472664.html

相关文章

回归预测 | Matlab基于CPO-GPR基于冠豪猪算法优化高斯过程回归的多输入单输出回归预测

回归预测 | Matlab基于CPO-GPR基于冠豪猪算法优化高斯过程回归的多输入单输出回归预测 目录 回归预测 | Matlab基于CPO-GPR基于冠豪猪算法优化高斯过程回归的多输入单输出回归预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 Matlab基于CPO-GPR基于冠豪猪算法优化高斯…

#QT项目实战(天气预报)

1.IDE:QTCreator 2.实验: 3.记录: (1)调用API的Url a.调用API获取IP whois.pconline.com.cn/ipJson.jsp?iphttp://whois.pconline.com.cn/ipJson.jsp?ip if(window.IPCallBack) {IPCallBack({"ip":&quo…

7-32 用天平找小球

三个球A、B、C,大小形状相同且其中有一个球与其他球重量不同。要求找出这个不一样的球。 输入格式: 输入在一行中给出3个正整数,顺序对应球A、B、C的重量。 输出格式: 在一行中输出唯一的那个不一样的球。 输入样例&#xff…

Day78:服务攻防-数据库安全RedisCouchDBH2database未授权访问CVE漏洞

目录 前置知识 数据库应用-Redis-未授权访问&CVE漏洞 未授权访问:CNVD-2015-07557 未授权访问-CNVD-2019-21763 未授权访问-沙箱绕过RCE-CVE-2022-0543 数据库应用-Couchdb-未授权越权&CVE漏洞 Couchdb 垂直权限绕过(CVE-2017-12635&…

2024.4.5-[作业记录]-day10-CSS 布局模型(层模型)

个人主页:学习前端的小z 个人专栏:HTML5和CSS3悦读 本专栏旨在分享记录每日学习的前端知识和学习笔记的归纳总结,欢迎大家在评论区交流讨论! 文章目录 作业 2024.4.5-学习笔记1 CSS定位1.1 相对定位 relative1.2 绝对定位 absolut…

C 练习实例97 - 读磁盘 写磁盘

题目&#xff1a;从键盘输入一些字符&#xff0c;逐个把它们送到磁盘上去&#xff0c;直到输入一个‘#’为止 在桌面新建一个hello.txt文件&#xff0c;内容示例&#xff1a; 代码&#xff1a; #include <stdio.h> #include <stdlib.h>int main() {FILE *fp; //文…

第十四届蓝桥杯省赛大学B组(C/C++)整数删除

原题链接&#xff1a;整数删除 给定一个长度为 N 的整数数列&#xff1a;A1,A2,...,AN。 你要重复以下操作 K 次&#xff1a; 每次选择数列中最小的整数&#xff08;如果最小值不止一个&#xff0c;选择最靠前的&#xff09;&#xff0c;将其删除&#xff0c;并把与它相邻的…

[计算机知识] 各种小问题思考

哈希算法以及哈希冲突 哈希算法&#xff1a;将任何长度的输入通过散列函数转换成固定长度的字符串 哈希冲突&#xff1a;不同的输入经过哈希函数处理后得到相同的哈希值 因为哈希函数的输出域是有限的 解决哈希冲突&#xff1a; 1. 开放寻址&#xff1a;产生哈希冲突后&…