一. 软件结构
- C/S结构:全称为Client/Server结构,是指客户端和服务器结构。常见程序有QQ、微信、支付宝等软件
- B/S结构: 全称为Browser/Server结构,是指浏览器和服务器结构。常见浏览器有IE、谷歌、火狐等.
以上两种架构,各有利弊,但都离不开网络,网络编程,就是基于一定的协议,实现两台计算机之间的通信的程序
二. 网络编程三大要素
2.1 IP地址和域名
2.1.1 IP地址
IP地址: 指互联网协议地址(lnternet Protocol Address) ,俗称IP。IP地址用来给一个网络中的计算机设备做唯一的编号。假如我们把"个人电脑"比作“一台电话”的话,那么“P地址”就相当于”电话号码”。
IP地址分类方式一:
- IPv4:
🤮网际协议版本4(英语:Internet Protocol version 4,IPv4),又称互联网通信协议第四版,是网际协议开发过程中的第四个修订版本,也是此协议第一个被广泛部署的版本。IPv4是互联网的核心,也是使用最广泛的网际协议版本,其后继版本为IPv6,直到2011年,IANA IPv4位址完全用尽时,IPv6仍处在部署的初期。
🤮IPv4使用32位(4字节)地址,因此地址空间中只有4,294,967,296(2)个地址。不过,一些地址是为特殊用途所保留的,如专用网络(约1800万个地址)和多播地址(约2.7亿个地址),这减少了可在互联网上路由的地址数量。随着地址不断被分配给最终用户,IPv4地址枯竭问题也在随之产生。基于分类网络、无类别域间路由和网络地址转换的地址结构重构显著地减少了地址枯竭的速度。但在2011年2月3日,在最后5个地址块被分配给5个区域互联网注册管理机构之后,IANA的主要地址池已经用尽。
- IPv6:
🤮由于互联网的蓬勃发展,IP地址的需求量愈来愈大,但是网络地址资源有限,使得P的分配越发紧张.为了扩大地址空间,拟通过IPv6重新定义地址空间,采用128位地址长度,每16个字节一组,分成8组十六进制数,表示成ABCD:EF01:2345:6789:ABCD:EF01:2345:6789,号称可以为全世界的每一粒沙子编上一个网址,这样就解决了网络地址资源数量不够的问题。IPv4和IPv6地址格式不相同,因此在很长一段时间里,互联网中出现IPv4和IPv6长期共存的局面。
IP地址分类方式二:
公网地址( 万维网使用)和 私有地址( 局域网使用)192.168.开头的就是私有址址,范围即为192.168.0.0-192.168.255.255,专门为组织机构内部使用
常用命令:
🏀查看本机IP地址,在控制台输入:
ipconfig /all
🏀检查网络是否连通,在控制台输入:
ping 空格 IP地址
ping 220.181.57.216
特殊的IP地址:
- 本地回环地址(HostAddress):
127.0.0.1 - 主机名(HostName):
localhost
2.1.2 域名
域名(英语:Domain Name),又称网域,是由一串用点分隔的名字组成的Internet上某一台计算机或计算机组的名称,用于在数据传输时对计算机的定位标识(有时也指地理位置)。
由于IP地址具有不方便记忆并且不能显示地址组织的名称和性质等缺点,人们设计出了域名,并通过网域名称系统(DNS,Domain Name System)来将域名和IP地址相互映射,使人更方便地访问互联网,而不用去记住能够被机器直接读取的IP地址数串
2.2 端口号
网络的通信,本质上是两个进程(应用程序)的通信。每台计算机都有很多的进程,那么在网络通信时,如何区分这些进程呢?
如果说IP地址可以唯一标识网络中的设备,那么端口号就可以**唯一标识设备中的进程(应用程序)**了。端口号: 用两个宁节表示的整数,它的取值范围是0~65535
- 公认端口: 0~1023。被预先定义的服务通信占用,如: HTTP (80) ,FTP (21),Tenet (23)。
- 注册端口: 1024~49151。分配给用户进程或应用程序。如: Tomcat (8080) ,MySQL (3306)Oracle (1521) 。
- 动态/私有端口: 49152~65535
💡小tips:
如果端口号被另外一个服务或应用所占用,会导致当前程序启动失败
2.3 网络协议
- 网络通信协议: 通过计算机网络可以使多台计算机实现通信连接,位于同一个网络中的计算机在进行连接和通信需要遵守一定的规则,这就好比在道路中行驶的汽车一定要遵守交通规则一样。在计算机网络中,这些连接通信的规则被称为网络通信协议,它对数据的传输格式、传输速率、传输步骤等做了统一规定,通信双方必同时遵守才能完成数据交换
- TCP/IP协议: 传输控制协议/因特网互联协议( Transmission Control Protocol/internet Protocol),是lnternet最基本、最广泛的协议。它定义了计算机如何连入因特网,以及数据如何在它们之间传输的标准。它的内部包含一系列的用于处理数据通信的协议,并采用了4层的分层模型,每一层都呼叫它的下一层所提供的协议来完成自己的需求。
TCP/IP通信模型图如下所示:
💡小tips:
我们常说的Tcp协议与ip协议是指位于TCP/IP模型中的传输层协议与网络层协议
三. TCP与UDP协议
3.1 UDP协议
UDP: 用户数据报协议(User Datagram Protocol),它是非面向连的,不可靠的无连接通信协议,即在数据传输时,数据的发送端和接收端不建立逻连接。简单来说,当一台计算机向另外一台计算机发送数据时,发送端不会确认接收端是否存在,就会发出数据,同样接收端在收到数据时,也不会向发送端反馈是否收到数据。
由于使用UDP协议消耗资源小,通信效率高,所以通常都会用于音频、视频和普通数据的传输例如视频会议都使用UDP协议,因为这种情况即使偶尔丢失一两个数据包,也不会对接收结果产生太大影响。
但是在使用UDP协议传送数据时,由于UDP的面向无连接性,不能保证数据的完整性,因此在传输重要数据时不建议使用UDP协议。
- 大小限制的: 数据被限制在64kb以内,超出这个范围就不能发送了.
- 数据报(Datagram): 网络传输的基本单位
3.2 TCP协议
TCP: 传输控制协议(Transmission ontrol Protocol)。它是面向连接的,可靠的通信协议,即传输数据之前,在发送端和接收端建立逻辑连接,然后再传输数据,它提供了两台计算机之间可靠无差错的数据传输。是一种面向连接的、可靠的、基于字节流的传输层的通信协议,可以连续传输大量的数据。类似于打电话的效果。
这是因为它为当一台计算机需要与另一台远程计算机连接时,TCP协议会采用“三次握手"方式让它们建立一个连接,用于发送和接收数据的虚拟链路。数据传输完毕TCP协议会采用“四次挥手"方式断开连接。
TP协议负责收集这些数据信息包,并将其按活当的次序放好传送,在接收端收到后再将其正确的还原。TCP协议保证了数据包在传送中准确无误。TCP协议使用重发机制,当一个通信实体发送一个消息给另一个通信实体后,需要收到另一个通信实体确认信息,如果没有收到另一个通信实体确认信息,则会再次重复刚才发送的消息。
四. 网络编程API
4.1 InetAddress类
InetAddress类主要表示IP地址,两个子类: Inet4Address.Inet6Address
Internet上的主机有两种方式表示地址:
域名(hostName): www.baidu.com
IP 地(hostAddress): 202.108.35.210
llnetAddress 类没有提供公共的构造器,而是提供了 如下几个静态方法来获取InetAddress 实例:
public static lnetAddress getLocalHost()
public static lnetAddress getByName(String host)
public static lnetAddress getByAddress(bytel] addr)
InetAddress 提供了如下几个常用的方法:
public String getHostAddress() : 返回IP地址字符串 (以文本表现形式)
public String getHostName): 获取此IP地址的主机名
代码演示如下:
@Test public void test01() throws UnknownHostException { //获取本地主机名和IP地址 InetAddress localHost = Inet4Address.getLocalHost(); System.out.println(localHost); }
代码演示如下:
/根据给定的host获取主机名和IP地址 InetAddress byName = Inet4Address.getByName("www.baidu.com"); System.out.println(byName); //根据给的byte数组【IP地址】获取主机名和IP地址 byte[] addres={(byte) 192,(byte) 168,31,105}; InetAddress byAddress = Inet4Address.getByAddress(addres); System.out.println(byAddress);
如何查看本地IP地址信息?
看如下操作:
4.2 socket分类
通信的两端都要有Socket(也可以叫“套接字”),是两台机器间通信的端点。**网络通信其实就是Socket间的通信。**Socket可以分为:
- 流套接字(stream socket):使用TCP提供可依赖的字节流服务
- ServerSocket:此类实现TCP服务器套接字。服务器套接字等待请求通过网络传入。
🔔ServerSocket:建立连接
- Socket:此类实现客户端套接字(也可以就叫“套接字”)。套接字是两台机器间通信的端点。
🔔Socket:传输数据
- 数据报套接字(datagram socket):使用UDP提供“尽力而为”的数据报服务
- DatagramSocket:此类表示用来发送和接收UDP数据报包的套接字。
🔔DatagramSocket:既建立连接,又传输数据
4.3 socket相关API
Socket类的常用构造方法:
public Socket(InetAddress address,int port):创建一个流套接字并将其连接到指定 IP 地址的指定端口号。public Socket(String host,int port):创建一个流套接字并将其连接到指定主机上的指定端口号。
Socket类的常用方法:
public InputStream getInputStream():返回此套接字的输入流,可以用于接收消息public OutputStream getOutputStream():返回此套接字的输出流,可以用于发送消息public InetAddress getInetAddress():此套接字连接到的远程IP 地址;如果套接字是未连接的,则返回 null。public InetAddress getLocalAddress():获取套接字绑定的本地地址。public int getPort():此套接字连接到的远程端口号;如果尚未连接套接字,则返回 0。public int getLocalPort():返回此套接字绑定到的本地端口。如果尚未绑定套接字,则返回 -1。public void close():关闭此套接字。套接字被关闭后,便不可在以后的网络连接中使用(即无法重新连接或重新绑定)。需要创建新的套接字对象。 关闭此套接字也将会关闭该套接字的 InputStream 和 OutputStream。public void shutdownInput():如果在套接字上调用 shutdownInput() 后从套接字输入流读取内容,则流将返回 EOF(文件结束符)。 即不能在从此套接字的输入流中接收任何数据。public void shutdownOutput():禁用此套接字的输出流。对于 TCP 套接字,任何以前写入的数据都将被发送,并且后跟 TCP 的正常连接终止序列。 如果在套接字上调用 shutdownOutput() 后写入套接字输出流,则该流将抛出 IOException。 即不能通过此套接字的输出流发送任何数据。
🔔注意:
先后调用Socket的shutdownInput()和shutdownOutput()方法,仅仅关闭了输入流和输出流,并不等于调用Socket的close()方法。在通信结束后,仍然要调用Scoket的close()方法,因为只有该方法才会释放Socket占用的资源,比如占用的本地端口号等。
4.4 DateGramSocket类
DatagramSocket 类的常用方法:
public DatagramSocket(int port):创建数据报套接字并将其绑定到本地主机上的指定端口。套接字将被绑定到通配符地址,IP 地址由内核来选择。public DatagramSocket(int port,InetAddress laddr):创建数据报套接字,将其绑定到指定的本地地址。本地端口必须在 0 到 65535 之间(包括两者)。如果 IP 地址为 0.0.0.0,套接字将被绑定到通配符地址,IP 地址由内核选择。public void close():关闭此数据报套接字。public void send(DatagramPacket p):从此套接字发送数据报包。DatagramPacket 包含的信息指示:将要发送的数据、其长度、远程主机的 IP 地址和远程主机的端口号。public void receive(DatagramPacket p):从此套接字接收数据报包。当此方法返回时,DatagramPacket 的缓冲区填充了接收的数据。数据报包也包含发送方的 IP 地址和发送方机器上的端口号。 此方法在接收到数据报前一直阻塞。数据报包对象的 length 字段包含所接收信息的长度。如果信息比包的长度长,该信息将被截短。
4.5 DateGramPacket类
DatagramPacket类的常用方法:
public DatagramPacket(byte[] buf,int length):构造 DatagramPacket,用来接收长度为 length 的数据包。 length 参数必须小于等于 buf.length。public DatagramPacket(byte[] buf,int length,InetAddress address,int port):构造数据报包,用来将长度为 length 的包发送到指定主机上的指定端口号。length 参数必须小于等于 buf.length。public int getLength():返回将要发送或接收到的数据的长度。






