前言:
什么是网络编程?
可以让设备中的程序与网络上其他设备中的程序进行数据交互(实现网络通信的)。
Java提供了哪些网络编程的解决方案
java.net.*包下提供了网络编程的解决方案!
基本的通信架构
基本的通信架构有2种形式:CS架构( Client客户端/Server服务端)、 BS架构(Browser浏览器/Server服务端)。
无论是CS架构,还是BS架构的软件都必须依赖网络编程!
网络通信三要素
IP地址
IP(Internet Protocol):全称”互联网协议地址”,是分配给上网设备的唯一标志。
IP地址有两种形式:IPv4、IPv6
IPv4
IPv6地址
IPv6:共128位,号称可以为地球每一粒沙子编号。
IPv6分成8段表示,每段每四位编码成一个十六进制位表示, 数之间用冒号(:)分开。
IP域名
公网IP, 内网IP
公网IP:是可以连接互联网的IP地址;内网IP:也叫局域网IP,只能组织机构内部使用。
192.168. 开头的就是常见的局域网地址,范围即为192.168.0.0--192.168.255.255,专门为组织机构内部使用。
特殊IP地址:
127.0.0.1、localhost:代表本机IP,只会寻找当前所在的主机。
IP常用命令:
ipconfig:查看本机IP地址。
ping IP地址:检查网络是否连通。
InetAddress
代表IP地址。
InetAddress的常用方法如下
总结:
1.说说网络通信至少需要几个要素
IP、端口、协议。
2.IP地址是做什么的,具体有几种
定位网络上的设备的,有IPv4 , IPv6.
3.如何查看本机IP地址,如何看是否与对方互通
ipconfig (WinOS) ifconfig(Mac)
ping 192.168.10.23
4.本机IP是谁?
127.0.0.1或者是localhost
5.IP地址的代表类是谁?
InetAddress类
6.如何获取本机IP对象
public static InetAddress getLocalHost()
7.如何判断与该IP地址对象是否互通?
public booleanisReachable(int timeout)
端口号
端口
标记正在计算机设备上运行的应用程序的,被规定为一个 16 位的二进制,范围是 0~65535。
分类
周知端口:0~1023,被预先定义的知名应用占用(如:HTTP占用 80,FTP占用21)
注册端口:1024~49151,分配给用户进程或某些应用程序。
动态端口:49152到65535,之所以称为动态端口,是因为它 一般不固定分配某种进程,而是动态分配。
注意:我们自己开发的程序一般选择使用注册端口,且一个设备中不能出现两个程序的端口号一样,否则出错。
总结:
1.端口号的作用是什么?
唯一标识正在计算机设备上运行的进程(程序)
2.一个设备中,能否出现2个应用程序的端口号一样,为什么?
不可以,如果一样会出现端口冲突错误。
协议
通信协议
网络上通信的设备,事先规定的连接规则,以及传输数据的规则被称为网络通信协议。
开放式网络互联标准:OSI网络参考模型
OSI网络参考模型:全球网络互联标准。
TCP/IP网络模型:事实上的国际标准。
传输层的2个通信协议
TCP(Transmission Control Protocol) :传输控制协议。
UDP(User Datagram Protocol):用户数据报协议;
TCP协议(通信效率相对不高!网页、文件下载、支付)
特点:面向连接、可靠通信。
TCP的最终目的:要保证在不可靠的信道上实现可靠的传输。
TCP主要有三个步骤实现可靠传输:三次握手建立连接,传输数据进行确认,四次挥手断开连接。
UDP协议(通信效率高!语音通话 视频直播)
特点:无连接、不可靠通信。
不事先建立连接,数据按照包发,一包数据包含:自己的IP、程序端口,目的地IP、程序端口和数据(限制在64KB内)等。
发送方不管对方是否在线,数据在中间丢失也不管,如果接收方收到数据也不返回确认,故是不可靠的 。
总结:
1、通信协议是什么?
计算机网络中,连接和通信数据的规则被称为网络通信协议。
2、TCP通信协议的特点是什么样的?
它是一种面向连接的可靠通信协议。
传输前,采用“三次握手”方式建立连接,点对点的通信,所以可靠。
在连接中可进行大数据量的传输。
通信效率较低。
3、UDP协议的特点是什么
用户数据报协议(User Datagram Protocol)
UDP是面向无连接,不可靠传输的通信协议。
速度快,有大小限制一次最多发送64K,数据不安全,易丢失数据。
TCP通信-快速入门
TCP通信
特点:面向连接、可靠通信。
通信双方事先会采用“三次握手”方式建立可靠连接,实现端到端的通信;底层能保证数据成功传给服务端。
Java提供了一个java.net.Socket类来实现TCP通信。
TCP通信之-客户端开发
客户端程序就是通过java.net包下的Socket类来实现的。
客户端发送消息
客户端实现步骤
①创建客户端的Socket对象,请求与服务端的连接。
②使用socket对象调用getOutputStream()方法得到字节输出流。
③使用字节输出流完成数据的发送。
④释放资源:关闭socket管道。
总结:
1.TCP通信,客户端的代表类是谁?
Socket类
public Socket(String host , int port)
2.TCP通信,如何使用Socket管道发送、接收数据 ?
OutputStreamgetOutputStream():获得字节输出流对象(发)
InputStreamgetInputStream():获得字节输入流对象(收)
TCP通信-服务端程序的开发
服务端是通过java.net包下的ServerSocket类来实现的。
ServerSocket
服务端实现接收消息
服务端实现步骤
①创建ServerSocket对象,注册服务端端口。
②调用ServerSocket对象的accept()方法,等待客户端的连接,并得到Socket管道对象。
③通过Socket对象调用getInputStream()方法得到字节输入流、完成数据的接收。
④释放资源:关闭socket管道
总结:
1.TCP通信服务端用的类是谁?
ServerSocket类,注册端口。
调用accept()方法阻塞等待接收客户端连接。得到Socket对象。
2.TCP通信服务端的开发步骤是什么?
TCP通信-多发多收
使用TCP通信实现:多发多收消息
使用TCP通信实现:多发多收消息。
①客户端使用死循环,让用户不断输入消息。
②服务端也使用死循环,控制服务端收完消息,继续等待接收下一个消息。
总结:
1.本次多发多收是如何实现的?
客户端使用循环反复地发送消息。
服务端使用循环反复地接收消息。
TCP通信-同时接收多个客户端(群聊)
总结:
1、群聊是什么含义?怎么实现?
是指一个客户端把消息发出去,其他在线的全部客户端都可以收到消息。
需要用到端口转发的设计思想。
服务端需要把在线的Socket管道存储起来,一旦收到一个消息要推送给其他管道
UDP通信-快速入门
UDP通信
特点:无连接、不可靠通信。
不事先建立连接;发送端每次把要发送的数据(限制在64KB内)、接收端IP、等信息封装成一个数据包,发出去就不管了。
Java提供了一个java.net.DatagramSocket类来实现UDP通信。
DatagramSocket: 用于创建客户端、服务端
DatagramPacket:创建数据包
使用UDP通信实现:发送消息、接收消息
客户端实现步骤
①创建DatagramSocket对象(客户端对象)——> 扔韭菜的人
②创建DatagramPacket对象封装需要发送的数据(数据包对象) ——> 韭菜盘子
③使用DatagramSocket对象的send方法,传入DatagramPacket对象 ——> 开始抛出韭菜
④释放资源
服务端实现步骤
①创建DatagramSocket对象并指定端口(服务端对象)——> 接韭菜的人
②创建DatagramPacket对象接收数据(数据包对象)——> 韭菜盘子
③使用DatagramSocket对象的receive方法,传入DatagramPacket对象 ——> 开始接收韭菜
④释放资源
总结:
1.实现UDP通信,如何创建客户端、服务端对象?
public DatagramSocket():创建发送端的Socket对象
public DatagramSocket(int port):创建接收端的Socket对象
2.数据包对象是哪个?
DatagramPacket
3.如何发送、接收数据?
使用DatagramSocket的如下方法:
public void send(DatagramPacketdp):发送数据包
public void receive(DatagramPacketdp) :接收数据包
UDP通信-多发多收
客户端可以反复发送数据
客户端实现步骤
①创建DatagramSocket对象(发送端对象)——> 扔韭菜的人
②使用while死循环不断的接收用户的数据输入,如果用户输入的exit则退出程序
③如果用户输入的不是exit, 把数据封装成DatagramPacket ——> 韭菜盘子
④使用DatagramSocket对象的send方法将数据包对象进行发送 ——>开始抛出韭菜
⑤释放资源
接收端可以反复接收数据
接收端实现步骤
①创建DatagramSocket对象并指定端口(接收端对象)——> 接韭菜的人
②创建DatagramPacket对象接收数据(数据包对象)——>韭菜盘子
③使用DatagramSocket对象的receive方法传入DatagramPacket对象 ——> 开始接收韭菜
④使用while死循环不断的进行第3步
总结:
1.UDP的接收端为什么可以接收很多发送端的消息?
接收端只负责接收数据包,无所谓是哪个发送端的数据包。