本文整理了学习Java网络通信编程的笔记,并分析了若干程序实例,以巩固学习成果。
1.1.1 基本概念
- 局域网(LAN)、广域网(WAN)
- IP协议,IP地址(IPv4,4个字节表示)
- TCP协议(传输控制协议):类似拨打电话,固接连线,可靠性高,有顺序
- UDP协议(数据用户报协议):类似发送信件,无连接通信,可靠性低,不保证顺序
- 端口(port):假想的连接装置,计算机与网络的物理连接,为整数
- 套接字(Socket):假想的连接装置,连接程序与端口
1.1.2 网络通信的要素
- 通信双方地址:IP、端口号
- 网络通信协议:TCP/IP协议
1.2.1 类
与IP地址相关的类,注意该类会抛异常
- IP地址:
- 本机(127.0.0.1)
- IPv4(4个字节组成,42亿),IPv6(128位,8个无符16进制整数)
- 公网(互联网),私网(局域网),ABCD类地址
- 无构造器,不可被,只可被自己的方法返回
- 常用方法:
- 获取与Host对应的对象
- 获取对象所包含的IP地址,返回String
- 获取IP主机名,返回String
- 获取本地主机的对象
1.2.2 类
服务器套接字,等待网络请求,注意该类会抛异常
- 端口:
- 0~65535
- 不同的进程用不同的端口号,类似于门牌
- 端口分类:
- 公有端口0~1023(80、443、21、23)
- 程序注册端口1024~49151(8080、3306、1521)
- 动态(私有)端口49152~65535
- 类:与类似,加入了端口,可以,传入String地址和int端口,有等方法
- 用于等待网络请求,构造方法:
- 非绑定服务器套接字
- 绑定特定端口
- 指定本机端口、指定的
- 指定端口、侦听和绑定到的本地IP地址
- 的常用方法:
- 等待客户机连接,若连接返回一个Socket套接字
- 判断绑定状态
- 返回本地地址的
- 返回关闭状态
- 关闭服务器套接字
- 绑定到特定地址(IP和端口)
- 获取等待端口
1.2.3 TCP网络程序
- 通信协议:速率、传输码率、代码结构、传输控制等
- TCP/IP协议:协议簇,最出名的是TCP协议和IP协议
- TCP:连接、稳定,三次握手四次挥手,客户端服务端架构,传输完成释放连接,效率低
- UDP:不连接、不稳定,客户端服务端无明确界限,效率高
- 参见第2章的实例
1.2.4 Tomcat基础
- Tomcat是一个服务端,客户端通过浏览器进入
- 一般使用8080端口
1.4.1 UDP通信
- 基本模式:
- 数据打包(数据包),发往目的地
- 接收数据包并查看
- 发送数据包步骤:
- 创建数据报套接字()
- 创建发送的数据包()
- 发送数据包()
- 接收数据包步骤:
- 创建数据报套接字并绑定到端口()
- 创建字节数组接收数据包()
- 接收UDP包()
1.4.2 类
- 表示数据包
- 构造方法:
- 指定数据包的内存空间和大小
- 指定数据包的目标地址和端口
1.4.3 类
- 表示发送和接收数据包的数据报套接字
- 构造方法:
- 绑定到本地主机任何可用端口
- 绑定到本地主机指定端口
- 绑定到指定的本地地址
1.4.4 UDP网络程序
- 服务端、客户端没有明确的界限
- 参见第3章的实例
统一资源定位器,通过地址定位互联网上的资源
- URL的形式:
- 构造方法:传入字符串,
- 常用方法:
- 获取协议名
- 获取主机IP
- 获取端口
- 获取路径
- 获取完整路径
- 获取查询名
- 参见第4章的实例
接收器()
发送器()
说明:
- 服务端和客户端都需要有套接字,分别是和,并且绑定到统一端口。服务端还有一个,是连接端口的返回结果。
- 注意输入流和输出流的使用,客户端使用输出流,通过套接字输出;服务端使用输入流,通过套接字输入,而这股输入流需要输出的话,还需要一个输出流。
先启动,再启动,观察到输出:
服务端()
客户端()
说明:
- 服务端将获取客户端的方法放在无限循环中,以便无限接收客户端的信息。
- 根据屏幕提示的信息,确定客户端是何时连接上服务端的。
先启动,再启动,在窗体输入文字,观察到窗体变化与输出:
服务端()
客户端()
说明:
- 示例中涉及到的输入输出流分别有(以输入流为例):(接收套接字流)、(用于文件与系统间的传输流)、(管道)、(用于处理服务端的回传字符)。
- 注意客户端第15行的,若不写这一行,即使客户端已写入完毕(并开始进行输入流的等待),服务端仍在继续读取(因为服务端第13行的,读取的字节数已为0,因此循环无法退出,处于读取0字节写入0字节的状态),因此要单向关闭客户端的套接字输出流,保证服务端结束读取。
先启动,再启动,观察到文件生成,以及输出:
发送器()
接收器()
说明:
- 发送器和接收器都有数据报套接字和数据包,但使用方式不同。
- 发送器的不用绑定端口,因为它只用方法,无需绑定发送者的端口;接收器的需要绑定端口,因为它用方法需要明确自己的地址。
- 发送器的需要绑定发送地址,因为它已有内容并打包好,需要向特定地址传递;接收器的不用绑定地址,因为它是一个空的容器,只起接收载体作用。
- 接收器第10行,不能用代替,数据包大小与数据字节数组的大小是不同的。
先启动,观察到程序开始等待,再启动,观察到输出:
聊天发送端线程()
聊天接收端线程()
聊天者A()
聊天者B()
说明:每个聊天者有两个线程,以及两个所需端口。A向的9999端口发信息,同时接收发送到8888端口名为B发来的信息;B向的8888端口发信息,同时接收发送到9999端口名为A发来的信息。
分别启动和,并输入文字,观察到两个程序分别输出:
广播()
收音机()
说明:
- 发出广播和接收广播的地址必须位于同一个组内,地址范围是224.0.0.0~224.255.255.255,该地址不代表某个特定主机的位置。
- 加入同一个组的主机可以在某个端口广播信息,也可以在某个端口接收信息。
启动,观察到其开始输出;启动并点击开始接收按钮,观察到其开始接收广播信息:
观察到文件的生成。
使用输入流、输出流时以下这段代码的原理:
- 是一个字节数组,长度为1024,类似于一个缓冲区。
- ,这一步从输入流读取大小的字节(即1024),把这些字节赋给,并返回读取的字节数。
- 把读取的字节数赋值给,然后对进行判断。
- 把数组的0到位置的字节写入输出流。
- 每次循环,就被重新赋值一次,因此文件大小与的长度1024是没有关系的。
- 读取到输入流末尾时,方法返回-1,循环结束。
- 注意:缓冲区的大小不应太小,否则会涉及到编码问题,部分字节被强行拆分到两个缓冲区时可能会出现乱码。
版权声明:
本文来源网络,所有图片文章版权属于原作者,如有侵权,联系删除。
本文网址:https://www.bianchenghao6.com/java-jiao-cheng/12208.html