1. 网络通信

1.1三要素:

  1. IP地址:网络中设备表示,可用主机名
  2. 端口号,用于表示进程的逻辑地址
  3. 传输协议:通讯的规则,常见的协议:TCP、IP

1.2 Socket

为网络编程提供的一种机制。

通信的两端都有Socket。

网络通信其实就是Socket间的通信,数据在两个Socket之间通过IO传输。

2. InetAddress

所有已实现的接口:

Serializable

直接已知子类:

Inet4Address(32位), Inet6Address(128位)

表示互联网协议 (IP) 地址。

  • IP 地址是 IP 使用的 32 位或 128 位无符号数字,它是一种低级协议,UDP 和 TCP 协议都是在它的基础上构建的。
  • InetAddress 的实例包含 IP 地址,还可能包含相应的主机名(取决于它是否用主机名构造或者是否已执行反向主机名解析)。
  • 地址类型:
    • 单播:单个接口的标识符。发送到单播地址的数据包被交付给由该地址标识的接口。
    • 多播:一组接口(通常属于不同的节点)的标识符。发送到多播地址的数据包被交付给由该地址标识的所有接口。
  • 主机名解析:
    • 主机名到 IP 地址的解析:通过使用本地机器配置信息和网络命名服务(如域名系统(Domain Name System,DNS)和网络信息服务(Network Information Service,NIS))来实现。要使用的特定命名服务默认情况下是本地机器配置的那个。对于任何主机名称,都返回其相应的 IP 地址。
    • 反向名称解析:意味着对于任何 IP 地址,都返回与 IP 地址关联的主机。

InetAddress 类提供将主机名解析为其 IP 地址(或反之)的方法。

2.1 方法

static InetAddress getByName(String host):在给定主机名的情况下确定主机的 IP 地址。

  • host:输出后是主机名/IP地址
  • IP:输出后是/IP地址
  • 有异常抛出:UnknownHostException

static InetAddress getLocalHost():返回本地主机

String getHostName():获取此 IP 地址的主机名。

String getHostAddress():返回 IP 地址字符串(以文本表现形式)。

2.2 使用

import java.net.InetAddress;
import java.net.UnknownHostException;public class Test{public static void main(String[] args) throws UnknownHostException{InetAddress local=InetAddress.getLocalHost();InetAddress remote=InetAddress.getByName("www.baidu.com");System.out.println("本地IP地址是:"+local.getHostAddress());System.out.println("百度的IP地址是:"+remote.getHostAddress());System.out.println("百度的主机名是:"+remote.getHostName());}
}

运行结果:

成功

3. UDP

User Datagram Protocol

用户数据包协议

是无连通协议:在发送数据时,数据的发送端和接收端不建立逻辑连接

消耗资源少,通信效率高

用于音频、视频和普通数据的传输

不保证数据完整性

数据包大小在64K

4. TCP

TAransmission Control Protocol

传输控制协议

面向连接的通信协议

在传输数据前,先在发送端和接受选建立逻辑连接,再传输数据。

提供了两台计算机之间的可靠的无差错疏忽传输

4.1 三次握手

创立连接

  1. C向S发出连接请求
  2. S向C回送一个响应
  3. C向S发送确认消息

可保证传输数据的安全性

eg.下载文件

5. DatagramPacket

此类表示数据报包。 UDP通信中发送或者接受的数据

数据报包用来实现无连接包投递服务(类似于集装箱)。

每条报文仅根据该包中包含的信息从一台机器路由到另一台机器。

从一台机器发送到另一台机器的多个包可能选择不同的路由,也可能按不同的顺序到达。

不对包投递做出保证。

5.1 构造方法

DatagramPacket(byte[] buf,int length): 构造DatagramPacket,用来接收长度为length的数据包。

  • 接收端的,只需要接收的一个字节数组来存放收到的数据,无需知道数据的来源

DatagramPacket(byte[] buf,int length,InetAddress address,int port): 构造数据报包,用来将长度为length的包发送到指定主机上的指定端口号。

  • 接收字节数组,指定发送目的端的IP地址和端口号。

5.2 方法

InetAddress getAddress():发挥某台机器的IP地址。此数据报将要发往该机器或者是从该机器接收到的。

int getPort():返回某远程主机的端口号。此数据报将要发往该主机或者是从该主机接收到的。

byte[] getData():返回数据缓冲区

int getLength():返回将要发送或接收到的数据的长度。

6. DatagramSocket

此类表示用来发送和接收数据报包的套接字。

数据报套接字是包投递服务的发送或接收点(类似于码头)。

每个在数据报套接字上发送或接收的包都是单独编址和路由的。从一台机器发送到另一台机器的多个包可能选择不同的路由,也可能按不同的顺序到达。

在 DatagramSocket 上总是启用 UDP 广播发送。为了接收广播包,应该将 DatagramSocket 绑定到通配符地址。在某些实现中,将 DatagramSocket 绑定到一个更加具体的地址时广播包也可以被接收。

DatagramSocket s=new DatagramSocket(null);
s.bind(new InetSocketAddress(8888));

这等价于:

DatagramSocket s=new DatagramSocket(8888);

两个例子都能创建能够在UDP 8888端口上接收广播的DatagramSocket。

6.1 构造方法

DatagramSocket():构造数据报套接字并将其绑定到本地主机上任何可用的端口。

DatagramSocket(int port):创建数据报套接字并将其绑定到本地主机上的指定端口。

  • 接收端:徐志鼎一个端口号,可监听指定的端口;
  • 发送端:可指定端口号;也可不指定,系统会分配一个没有被其他网络程序使用的端口号

6.2 方法

void receive(DatagramPacket p): 从此套接字接收数据报包。

void send(DatagramPacket p):从此套接字发送数据报包。

7. UDP网络程序

7.1 发送端

  • 创建DatagramSocket对象
  • 创建DatagramPacket对象,并封装数据
  • 发送数据
  • 释放流资源
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;public class Test{public static void main(String[] args) throws IOException{DatagramSocket sendSocket=new DatagramSocket();byte[] buffer="hello,UDP".getBytes();DatagramPacket dp=new DatagramPacket(buffer,buffer.length,InetAddress.getByName("***本机IP地址***"),8888);sendSocket.send(dp);sendSocket.close();}
}

7.2 接收端

  • 创建DatagramSocket对象
  • 创建DatagramPacjet对象
  • 接收数据存储到DatagramPacket对象中
  • 获取DatagramPacket对象的内容
  • 释放流资源
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;public class DemoTest{public static void main(String[] args) throws IOException {DatagramSocket receiveSocket=new DatagramSocket(8888);byte[] buffer=new byte[1024];DatagramPacket dp=new DatagramPacket(buffer,1024);receiveSocket.receive(dp);InetAddress ipAddress=dp.getAddress();String ip=ipAddress.getHostAddress();byte[] data=dp.getData();int length=dp.getLength();String datastr=new String(data,0,length);System.out.println("IP地址:"+ip+",数据是:"+datastr);receiveSocket.close();}
}

运行结果:

7.3 分析

发送端

DatagramPacket dp=new DatagramPacket(buffer,buffer.length,InetAddress.getByName("***本机IP地址***"),8888);如果此句中,主机名错,UnknowHostException;端口号错,可正常发出,接收端收不到。

无连接的协议,无接收端也可运行。

接收端

启动两次接收端:

  • 第一次正常
  • 第二次:BindException,端口号已绑定。
    • 端口号不可重复,它是一个进程在内存中的地址

网络通信-1(InetAddress、UDP、TCP、DatagramPacket、DatagramSocket、UDP通信示例)相关推荐

  1. 【Java 网络编程】UDP 服务器 客户端 通信 ( DatagramSocket | DatagramPacket | UDP 发送数据包 | UDP 接收数据包 | 端口号分配使用机制 )

    文章目录 I UDP 信息发送接收原理 II UDP 发送和接收端口相同 III UDP 发送信息代码示例 IV UDP 接收信息代码示例 V UDP 服务器端代码示例 VI UDP 客户端代码示例 ...

  2. 自定义Udp/Tcp协议,通信协议Socket/WebSocket,IM粘包、分包解决等(2),ProtocolBuffer

    > 自定义Udp/Tcp协议/通信协议(Java/C):自定义构建和解析IM协议消息:IM自定义UDP通信协议   类似于网络通信中的TCPIP协议一般,比较可靠的通信协议往往包含有以下几个组成 ...

  3. java udp tcp协议_【java】TCP和UDP传输协议

    TCP协议和UDP协议的比较 TCP的全称是Transmission Control Protocol (传输控制协议) 传输控制协议,是一种面向连接的协议,类似打电话 在通信的整个过程中保持连接 保 ...

  4. 接收udp数据_聊聊UDP、TCP和实现一个简单的JAVA UDP小Demo

    最近真的比较忙,很久就想写了,可是一直苦于写点什么,今天脑袋灵光一闪,觉得自己再UDP方面还有些不了解的地方,所以要给自己扫盲. 好了,咱们进入今天的主题,先列一下提纲: 1. UDP是什么,UDP适 ...

  5. JVAV——网络编程UDP/TCP

    一: 计算机网络可以实现多台计算机的连接但不同的计算机操作系统和硬件体系结构不同,为了提供通信支持位于同一网络中的计算机必须要遵循一定的规则.目前应用最广泛的是TCP/IP,UDP,ICMP等协议. ...

  6. Android中的TCP协议与UDP协议

    TCP和UDP在网络传输中非常重要,在Android开发中同样重要. 什么是TCP? TCP:Transmission Control Protocol 传输控制协议TCP是一种面向连接(连接导向)的 ...

  7. java 网络编程 UDP TCP

    网络编程 网络编程主要用于解决计算机与计算机(手机.平板..)之间的数据传输问题. 网络编程: 不需要基于html页面就可以达到数据之间的传输. 比如: feiQ , QQ , 微信.... 网页编程 ...

  8. TCP/IP和UDP的区别

    TCP/IP 和UDP最大的区别就是:TCP/IP是面向连接的,UDP是非面向连接的.通俗一点说就是:TCP/IP管发管到,UDP管发不管到.因此,在安全性方面来说,TCP/IP更具有优越性. 第二: ...

  9. Java中udp/tcp的发送和接收

    一.UDP协议发送数据 发送处理过程: 创建发送端Socket对象--DatagramSocket 创建数据并将数据打包到DatagramPacket对象 通过Socket发送 释放相关资源 发送处理 ...

最新文章

  1. linux在屏幕上显示问候信息,linux系统版本查看
  2. Python+Django+Nginx+Uwsgi 详细部署过程(爬坑过程,可以了解各个软件的执行流程,看过)
  3. oracle驱动权限如何修改,详解如何实现Oracle修改用户权限和角色
  4. CCF201712-2 游戏
  5. openwrt - transmission
  6. 程序员修炼之道:务以己任,实则明心——通向务实的最高境界
  7. 22HTML5期末大作业:电影网站设计——电影我不是药神响应式页播(4页) HTML+CSS+JavaScript 大学生电影网页作品 影视网页设计作业模板 学生网页制作源代码下载
  8. 美通企业日报 | 阿里收购网易考拉入股网易云音乐;宁德时代与博世达成战略合作...
  9. 华为云上云迁移工具案例实践:阿里云迁移到华为云
  10. MySQLzip格式安装包
  11. iMazing中IPA文件的介绍与管理
  12. 机器人李继红_李继宏
  13. 20201203英语单词学习(仅供自己记录)
  14. Ubunbu18.4运行代码bug提示:Successful NUMA node read from SysFS had negative value (-1)
  15. 黑莓省电模式 for BlackBerry 9900 9930 9850 OS7 1
  16. select2.js插件新增支持拼音搜索
  17. 精简瘦身Windows XP的方法
  18. 微信小程序报错:[uCharts] 未获取到context 注意:v2.0版本后,需要自行获取canvas的绘图上下文并传入opts.context
  19. 大数据在锂电池产品全生命周期中的应用
  20. Lerna 使用教程 -- 开发脚手架的流程和核心命令详解

热门文章

  1. 日志组件logback介绍及配置使用方法
  2. [原创]RCP项目:数字图像处理软件
  3. mnesia数据库学习笔记四
  4. oracle中备份package源码
  5. PolarMask:单阶段实例分割框架,FCOS进阶!
  6. 563. 二叉树的坡度
  7. SDG、SGD-M实现
  8. 2:IDEA生成springboot项目,修改启动图标和网页端口
  9. goroutine sync.RWMutex读写锁RLock的使用
  10. k8s serviceaccount pod亲和性 污点