Java网络通信

news2024/11/18 11:17:00

网络通信

网络程序设计是编写与其他计算机进行通讯的程序。Java已经将网络程序所需要的对象封装成不同的类。只要创建这些类的对,使用相应的方法,即使设计人员不具有关的网络知识,也可以编写处高质量的网络通讯程序

现实两台计算机的通信,必须要用一个网络线路连接两台计算机
服务器<----->网络<------>客户机
在这里插入图片描述
服务器:提供信息的计算机或程序
客户机:请求信息的计算机程序
网络:用于连接服务器与客户机


局域网与因特网

1.局域网(Local Area Newwork,LAN)

多个计算机相互连接组成的封闭式计算机组,可以有两台计算机组成;也可以由同以区域内上千台计算机组成

2.因特网(Internet)

由于LAN延伸到更大的范围,这样的网络称为广域网(Wide Area Network,WAN),它主要讲分布在不同地区的局域网或计算机系统互连起来,到达资源共享的目的
因特网(Internet),就是世界范围内最大的广域网


网络协议

网络协议规定了计算机之间连接物理、机械(网线与网卡的连接规定)、电气(有效的电平范围)等待征以及计算机之间的相互寻址规则、数据发送冲突的解决、长的数据如何分段传送与接收等。就像不同的国家有不同的法律一样,目前网络协议有多种

1.IP协议(Internet Protocol)

一种网络协议。Internet网络采用的协议是TCP/IP协议,其全称是Transmission Control Protocol/Internet Protocol。Internet网络上存在数以亿计的主机,每一台主机在网络上用为其分配的Internet地址代表自己,这个地址就是IP地址

IPv4:到目前为止IP地址用4个字节,也就是32位的二进制数来表示,称为IPv4。为了便于使用,通常取用每个字节的十进制数,并且每字节之间用圆点隔开表示IP地址,如127.0.0.1
IPv6:使用16个字节来表示IP地址

TCP/IP模式是一种层次结构,共分为4层,分别为应用层、传输层、网络互连层和主机到网络层。各层实现特定的功能,提供特定的服务个访问接口,并具有相对的独立性


2.TCP/UDP协议

在TCP/IP协议栈中,有两个高级协议是网络应用程序编写者一个了解的,即TCP(Transmission Control Protococl,传输控制协议)与UDP(User Datagram Protocol,用户数据报协议)

TCP协议(固连接,传输靠谱)
TCP协议是一种以固连接线为基础的协议,它是提供两台计算机间可靠的数据传送。TCP可以保证从一端数据送至连接的另一端时,数据能够确实送达,而且抵达的数据的排列顺序和送出时的顺序相同,因此,TCP协议适合可靠性要求比较高的场合。就想拨打电话,必须先拨号给对方,等待两端确定连接后,相互才能听到对方说话,也知道对方回应的是什么

HTTP、FTP和Telnet等都需要使用可靠的通信频道,例如,HTTP从某个URL读取数据时,如果收到的数据顺序与发送时不相同,就可能会出现一个混乱的HTML文件或是一些无效的信息

UDP协议(无连接,传输不靠谱)
UDP是无连接通信协议,不保证可靠数据的传输,但能够向若干个目标发送数据,接收发自若干个源的数据。UDP是以独立发送数据包的方式进行。这种方式就像邮递员送信这收信人

UDP协议适合于一些对数据准确性要求不高的场合,如网络聊天室、在线影片等。这是由于TCP协议在认证上存在额外耗费,可能使传输速度减慢,而UDP协议可能会更适合这些对传输速度和时效要求非常高的网站,即使有一小部分数据包遗失或传输顺序有所不同,也不会严重危害该项通信


端口和套接字

1.端口(port)

“端口”是英文port的意译,可以认为是设备与外界通信交流的出口,所有的数据都通过该出口与其他计算机或者设备相连。网络程序设计中的端口并非真实的物理存在,而是一个假想的连接装置。端口被规定为一个在0~65535之间的整数。

HTTP服务一般使用80端口,FTP服务使用21端口。假如一台计算机提供了HTTP、FTP等多种服务,那么客户机会通过不同的端口来确定连接到服务器的哪项服务上

通常0~1023之间的端口用于一些知名的网络服务和应用,用户的普通网络应用应该使用1024以上的端口数,以避免端口号与另一个应用或系统服务所用端口冲突

2.套接字(Socket)

网络程序中的套接字(Socket)用于将应用程序与端口连接起来。套接字是一个假想的连接装置,就像插插头的设备“插座”用于连接电器与电线一样。Java将套接字抽象化为类,程序设计者只需要创建Socket类对象,即可使用套接字


IP地址封装(封装类InetAddress)

IP地址是每台计算机在网络上的唯一标识,它是32位或128位的无符号数字,使用4组数字表示一个固定的编号,如‘192.168.128.255’就是局域网络中的编号

IP地址是一种底级协议,UDP和TCP都是在它的基础上构建的

Java提供了IP地址的封装类InetAddress,它位于java.net包中,主要封装了IP地址,并提供了相关的常用方法,如获取IP地址、主机地址等

InetAddress类的常用方法

方法返回值功能
getByName(String host)InetAddress获取与Host相对应的InetAddress对象
getHostAddress()String获取InetAddress对象所含的IP地址
getHostName()String获取此IP地址的主机名
getLocalHost()InetAddress返回本地主机的InetAddress对象
isReachable(int timeout)boolean在timeout指定的毫秒时间内,测试是否可以达到该地址

TCP程序设计

TCP(传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。在Java中,TCP程序设计是指利用ServerSocket类和Socket类编写的网络通信程序。利用TCP协议进行通信的两个应用程序是由主次之分的,一个称为服务器端程序,另一个称为客户端程序,两者的功能编写方法不大一样
①服务器程序创建一个ServerSocket(服务器端套接字),调用accept()方法等待客户机来连接
②客户端程序创建一个Socket,请求与服务器建立连接
③服务器接收客户机的连接请求,同时创建一个新的Socket与客户建立连接。服务器继续等待新的请求

ServerSocket服务器端

它可以通过指定的端口来等待连接的套接字。服务器套接字一次可以与一个套接字连接。如果多台客户机同时提出连接请求,服务器套接字会将请求连接的客户机存入队列中,然后从中取出一个套接字,与服务器新建的套接字连接起来。若请求连接数大于最大容纳数,则多出的连接请求被拒绝。队列的默认大小是50

ServerSocket类的构造方法
ServerSocket类的构造方法都抛出IOException异常

构造方法描述
ServerSocket()创建非绑定服务器套接字
ServerSocket(int port)创建绑定到特定端口的服务器套接字
ServerSocket(int port,int backlog)利用指定的backlog创建服务器套接字并将其绑定到指定的本地端口号
ServerSocket(int port,int backlog,InetAddress bindAddress)使用指定端口、侦听bcklog和要绑定到本地IP地址创建服务器
这种情况适用于计算机上有多块网卡和多个IP地址的情况,用于可以明确规定ServerSocket在哪块网卡或IP地址上对待你客户的连接请求

ServerSocket类的常用方法

方法返回值描述
accept()Socket等待客户机的连接。若连接,则创建一个套接字
isBound()boolean判断ServerSocket的绑定状态
getInetAddress()InetAddress返回此服务器套接字的本地地址
isClosed()boolean返回服务器套接字的关闭状态
close()void关闭服务器套接字
bind(SocketAddress endpoint)void将ServerSocket绑定到特定地址(IP地址和端口号)
getLocalPort()int返回服务器套接字等待的端口号

使用ServerSocket对象的accept()方法时,会阻塞线程的继续执行,直到接收到客户端的呼叫。


Socket客户端

调用ServerSocket类的accept()方法会返回一个和客户端Socket对象相连接的Socket对象,java.net包中的Socket类用于表示客户端套接字,它采用TCP建立计算机之间的连接,并包含了Java语言所有对TCP有关的操作方法,如建立连接、传输数据、断开连接等。

Socket构造方法
Socket类定义了多个构造方法,它们可以根据InetAddress对象或者字符串指定的IP地址和端口号创建实例。

构造方法描述
Socket()通过系统默认类型的SocketImpl创建为连接套接字
Socket(InetAddress address,int port)创建一个流套接字并将其连接到指定IP地址的指定端口号
Socket(InetAddress address,int port,InetAddress localAddr,int localPort)创建一个套接字并将其连接到指定远程地址上的指定远程端口
Socket(String host,int port)创建一个流套接字并将其连接到指定主机上的指定端口号
Socket(String host,int port,InetAddress localAddr,int localPort)创建一个套接字并将其连接到指定远程主机上的指定远程端口

Socket类常用方法

方法返回值描述
bind(SocketAddress bindpoint)void将套接字绑定到本地地址
close()void关闭此套接字
connect(SocketAddress endpoint)void将此套接字连接到服务器
connect(SocketAddress endpoint,int timeout)void将此套接字连接到服务器,并指定一个超时值
getInetAddress()InetAddress返回套接字连接的地址
getInputStream()InputStream返回此套接字的输入流
getLocalAddress()InetAddress获取套接字绑定的本地地址
getLocalPort()int返回此套接字绑定到的本地端口
getOutputStream()OutputStream返回此套接字的输出流
getPort()int返回此套接字连接到的远程端口
isBound()boolean返回此套接字的绑定状态
isClosed()boolean返回套接字的关闭状态
isConnected()boolean返回套接字的连接状态

TCP网络程序实例

(1)服务器端
创建服务器端类Server,首先创建服务器端套接字对象;然后监听客户接入,并读取接入的客户端IP地址和传入得消息;最后像接入的客户端发送一条信息

(2)客户端
创建客户端类Client,在程序中,首先创建客户端套接字,连接指定的服务器;然后向服务器端发送数据和接收服务器端传输的数据


UDP程序设计

UDP(User Datagram Protocol,用户数据报协议),它是网络信息传输的另一种形式。UDP通信和TCP通信不同,基于UDP的信息传递更快,但不提供可靠的保证,虽然UDP是一种不可靠的协议,但如果需要较快地传输信息,并能够容忍小的错误,可以考虑使用UDP
基本模式:
(1)将数据打包(称为数据包),然后将数据包发往目的地
(2)接收别人发来的数据包,然后查看数据包

使用Java进行UDP程序设计

1.发送数据包

(1)使用DatagramSocket()创建一个数据包套接字
(2)使用DatagramPackage(byte[] buf,int offset,int length,InetAddress address,int port):创建要发送的数据包

2.接收数据包

(1)使用DatagramSocket(int port)创建数据包套接字,绑定到指定的端口
(2)使用DatagramPacket(byte[] buf,int length)创建字节数组来接收数据包
(3)使用DatagramPacket类的receive()方法接收UDP包

DatagramPacket类

java.net包的DatagramPacket类用来表示数据包,该类的构造方法函数如下。
(1)DatagramPacket(byte[] buf,int length):创建DatagramPacket对象,指定了数据包的内存空间和大小
(2)DatagramPacket(byte[] buf,int length,InetAddress address,int port):创建DatagramPacket对象,不仅指定了数据包的内存空间和大小,还指定了数据包的目标地址和端口

在发送数据时,必须指定接收方的Socket地址和端口,因此使用第二种构造函数可以创建发送数据的DatagramPacket对象

DatagramPacket类的常用方法

方法返回值描述
getAddress()InetAddress返回某台机器的IP地址,此数据报将要发往该机器或者是从该机器接收到的
getData()byte[]返回数据缓冲区
getLength()int返回将要发送或接收到的数据的长度
getOffset()int返回将要发送或接收到的数据偏移量
getPort()int返回某台远程主机的端口号,此数据报将要发往该主机或者是从该主机接收到的
getSocketAddress()SocketAddress获取要将此包发送到的或者发出此数据报的远程主机的SocketAddress
setAddress(InetAddress iaddr)void设置要将此数据报发往的那台机器的IP地址
setData(byte[] buf)、setData(byte[] buf,int offset,int length)void 为此包设置数据缓冲区
setLength(int length)void设置要将此数据报发往的远程主机上的端口号
setSocketAddress(SocketAddress address)void设置要将此数据报发往的远程主机的SocketAddress(通常为IP地址+端口号)

DatagramSocket类

java.net包中的DatagramSocket类用于表示发送和接收数据包的套接字,该类的构造方法函数有以下3种
(1)DatagramSocket():创建DatagramSocket对象,构造数据报套接字并将其绑定到本机主机上任何可用的端口
(2)DatagramSocket(int port):创建DatagramSocket对象,创建数据报套接字并将其绑定到本地主机上的指定端口

DatagramSocket(int port,InetAddress addr):创建DatagramSocket对象,创建数据报套接字,并将其绑定到指定的本地地址,该构造函数适用于有多块网卡和多个IP地址的情况

DatagramSocket类的常用方法

方法返回值描述
bind(SocketAddress addr)void将此DatagramSocket绑定到特定的地址和端口
close()void关闭此数据报套接字
connect ( InetAddress address,int port)void将套接字连接到此套接字的远程地址
coonect(SocketAddress addr)void将此套接字连接到远程套接字地址(IP地址+端口号)
disconnect()void断开套接字的连接
getInetAddress()InetAddress返回此套接字连接的地址
getLocalAddress()InetAddress获取套接字绑定的本地地址
getLocalPort()int返回此套接字绑定的本地主机上的端口号
getLocalSocketAddress()SocketAddress返回此套接字绑定的端点的地址,如果尚未绑定则返回null
getPort()int返回此套接字的绑定状态
isBound()boolean返回套接字的绑定状态
isClosed()boolean返回是否关闭了套接字
isConnected()boolean返回套接字的连接状态
receive(DatagramPacket p)void从此套接字接收数据包
send(DatagramPacket p)void从此套接字发送数据包

使用DatagramSocket类创建的套接字是单个的数据报套接字。UDP协议是一种多播数据传输协议,那么可以创建多播的数据报套接字吗?答案是肯定的,DatagramSocket类提供了一个子类MulticatSocket,它表示多播数据报套接字,该类用于发送个接收IP多播包。MulticastSocket类是IP地址范围在224.0.0.0和239.255.255.255的范围内(包括两者),但这里需要说明的是地址224.0.0.0虽然被保留,但不一个使用

由于MulticastSocket类是DatagramSocket类的子类,因此他包含DatagramSocket类中的所有公有方法,除此之外,它还有两个特殊的方法joinGroup和leaveGroup
(1)joinGroup(InetAddress mcastaddr):加入多播组,参数mcastaddr表示要加入的多播地址
(2)leaveGroup(InetAddress mcastaddr):离开多播组,参数mcastaddr表示要离开的多





上一篇:JDBC操作数据库                        下一篇:Java注解




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

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

相关文章

Activiti基本使用2

目录 3、流程实例 3.1、什么是流程实例 3.2、让实际业务与activiti表关联(BusinessKey) 3.3、挂起&#xff0c;激活流程实例 3.3.1、全部流程实例挂起 3.3.2、单个流程实例挂起 4、任务分配 4.1、固定分配 4.2、表达式分配 4.2.1、UEL-value 4.2.2、UEL-method 方式…

“码”上反馈,自动留痕:二维码助力湖塘街道人居环境巡查高效化

绍兴市柯桥区湖塘街道将农村人居环境巡查同二维码技术相结合&#xff0c;具体应用到了“村民垃圾分类检查”、“公厕卫生检查”和“各村垃圾分类工作的督导记录”这三项检查工作中&#xff0c;做到了“码”上反馈、自动留痕&#xff0c;有效提升了巡检实效&#xff0c;在2020年…

什么是薪酬管理系统,薪酬管理有哪些功能?

阅读本文您将了解&#xff1a;1.薪酬管理系统的定义&#xff1b;2.薪酬管理系统的功能&#xff1b;3.薪酬管理系统的作用。 一、薪酬管理系统是什么 薪酬管理系统是一种用于管理企业员工的薪资和奖金的工具。它可以自动计算员工的工资和奖金&#xff0c;记录员工的考勤和休假…

凌恩生物文献分享|大热门--HiFi宏基因组有效提升真核生物群落检出效果

binning和HiFi宏基因组测序优势&#xff1a; 不依赖于微生物的分离培养&#xff0c;环境微生物单菌基因组&#xff08;框架图&#xff09;研究的一种新的途径和高性价比策略&#xff1b; 可以得到环境中丰度较低的宏基因组&#xff0c;为研究低丰度微生物提供了途径&#xff1b…

【Unity VR开发】结合VRTK4.0:高亮与标签

语录&#xff1a; 信仰到底是什么呢&#xff0c;就是纵身一跃&#xff0c;就是我们跟神之间一个永远的约定&#xff0c;是舍弃日的去开始新的生活;信仰就是从今以后&#xff0c;再也不要放开你的手。 前言&#xff1a; Interactable Highlighter &#xff1a;当我们的手柄触碰…

Android Framework源码解析篇~

应用启动流程 Activity启动流程 关键debug节点&#xff1a; //左侧 ActivithThread //右侧 ActivityTaskManagerService>..>ActivityTaskSupervisor //中继 debug:ClientTransaction.schedule>mclient.scheduleTransaction //这里是 mclient是 ApplicationThread,从…

++i与i++有什么区别?

在编程时&#xff0c;经常会用到变量的自增或自减操作&#xff0c;尤其在循环中用的最多。以自增为例&#xff0c;有两种自增方式&#xff1a;前置和后置&#xff0c;即i和i&#xff0c;它们的不同点在于i是在程序执行完毕后进行自增&#xff0c;而i是在程序开始执行前就进行自…

基于Java+Springboot+Vue+elememt社区疫情返乡管控系统设计实现

基于JavaSpringbootVueelememt社区疫情返乡管控系统设计实现 博主介绍&#xff1a;5年java开发经验&#xff0c;专注Java开发、定制、远程、指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 Java项目精品实战案例《500套》 欢迎点赞 收藏 ⭐留言 文末获取源码联系…

Python爬取电商数据:商品采集接口 商品详情数据API 商品主图接口

学习Python自动化的一个好办法就是构建一个价格追踪器。由于这项任务生成的脚本可以立即投入使用&#xff0c;所以对于初学者来说尤为方便。本文将向大家介绍如何用Python采集器建立一个可立即实现电商价格监控的可扩展价格追踪器。 价格监控的目的 价格监控的好处多多。对于…

公司招人,面了一个4年经验不会自动化的测试人,他凭什么要15K?

在深圳这家金融公司也待了几年&#xff0c;被别人面试过也面试过别人&#xff0c;大大小小的事情也见识不少&#xff0c;今天又是团面的一天&#xff0c; 一百多个人都聚集在一起&#xff0c;因为公司最近在谈项目出来面试就2个人&#xff0c;无奈又被叫到面试房间。 整个过程…

No manual entry for ls解决办法

No manual entry for ls解决办法 如果在 Linux 中运行 man ls 命令时提示“no manual entry for ls”&#xff0c;则可能是因为您的系统没有安装 man 页面或者该页面已经被删除。此外&#xff0c;也有可能是您输入的命令不是标准命令。 可以通过以下方式进行排查&#xff1a;…

Git 时间线管理

Git 时间线管理 这一部分主要讲的是 取消(undo) 变化 和在不同的时间锚点跳来跳去&#xff0c;以 command 为主。 设计到的commits有&#xff1a; checkoutrestoreresetrevert checkout checkout 的一部分作用&#xff0c;即切换分枝在 git 分支操作 中有提到过&#xff0…

ESP32-s2芯片esp32-s2-saola-1开发板 micropython的repl连接

本文只是解决通过esp32-s2-saola-1开发板 自带microUSB 作为repl与micro python通信的问题。 如果你对esp32&#xff0c;micropython不熟&#xff0c;本文不适合你。 如果你用的不是esp32-s2&#xff0c;你不需要关心。 区分两个USB&#xff1a; 1. esp32-s2原生USB&#x…

25K 入职阿里的那天,我特么哭了

悲催的经历&#xff1a; 先说一下自己的个人情况&#xff0c;计算机专业&#xff0c;17 年本科毕业&#xff0c;一毕业就进入了“腾讯”测试 岗(进去才知道是接了个腾讯外包项目&#xff0c;可是刚毕业谁知道什么外包不外包的)。 更悲催的是&#xff1a;刚入职因为家里出现一…

什么是CDN加速?CDN加速有哪些作用?

一、什么是 CDN CDN 的全称是 Content Delivery Network&#xff0c;即内容分发网络。CDN 是在现有 Internet 基础上增加一层新的网络架构&#xff0c;通过部署边缘服务器&#xff0c;采用负载均衡、内容分发、调度等功能&#xff0c;使用户可以就近访问获取所需内容&#xff…

VMware 安装 MS-DOS7.10 并配置网络

VMware 安装 MS-DOS7.10 并设置软盘共享 1. 新建虚拟机2. 开机2.1. 这几个地方都可以开机2.2. 手速慢&#xff0c;进不了BIOS的朋友可以点这里 安装 MS-DOS7.101. 先选 1 安装 MS-DOS7.10 回车2. 欢迎页面&#xff0c;客气一下而已&#xff0c;继续 Next3. 继续王婆卖瓜4. 这步…

HDCTF 2023 Pwn WriteUp

Index 前言Pwnner分析EXP: KEEP_ON分析EXP: Minions分析EXP: 后记&#xff1a; 前言 本人是菜狗&#xff0c;比赛的时候只做出来1题&#xff0c;2题有思路但是不会&#xff0c;还是太菜了。 栈迁移还是不会&#xff0c;但又都是栈迁移的题&#xff0c;真头大。得找时间好好学学…

如何在 Java 8 中使用 Streams?结合多种案例剖析学习!

Java 8 Streams 是一个非常强大的功能&#xff0c;它提供了一种简洁、优雅的方式来处理数据集合。通过使用 Streams&#xff0c;我们可以轻松地过滤、映射、排序、聚合等操作数据。本教程将介绍 Streams 的基本概念&#xff0c;以及如何在 Java 8 中使用 Streams。本教程还包括…

【计算机视觉 | 语义分割】OVSeg:分割一切后,SAM又能分辨类别了,Meta/UTAustin提出全新开放类分割模型

文章目录 一、前言二、研究背景三、论文解读3.1 动机3.2 方法3.3 结果 一、前言 前几日&#xff0c;Meta 推出了「分割一切」AI 模型 Segment Anything&#xff0c;令网友直呼 CV 不存在了&#xff1f;&#xff01; 而在另一篇被 CVPR 2023 收录的论文中&#xff0c;Meta、UT…

《计算机网络——自顶向下方法》精炼——2.2.3-2.2.5

文章目录 引言正文HTTP报文请求行首部行实体体其他方法 HTTP响应报文实体体和初始状态行首部行 cookiecookie的运行过程Web缓存条件GET方法 引言 计算机网络在这一学科中的重要性毋庸置疑&#xff0c;而黑皮书又是这一学科的教科书级经典&#xff0c;因此本书是计算机从业者的…