网络编程相关概念
七层网络模型
在学习网络编程之前首先要一些网络常识。
OSI七层模型和TCP/IP五层模型
--当发送数据时,需要对发送的内容按照上述七层模型进行层层加包后发送出去。
-- 当接收数据时,需要对接收的内容按照上述七层模型相反的次序层层拆包并显示出来。
相关的协议
计算机在网络中实现通信就必须有一些约定或者规则,这种约定和规则就叫做通信协议,通信协议可以对速率、传输代码、代码结构、传输控制步骤、出错控制等制定统一的标准。
TCP协议
传输控制协议(Transmission Control Protocol),是一种面向连接的协议,类似于打电话。
- 建立连接 => 进行通信 => 断开连接
- 在传输前采用"三次握手"方式。
- 在通信的整个过程中全程保持连接,形成数据传输通道。
- 保证了数据传输的可靠性和有序性。
- 是一种全双工的字节流通信方式,可以进行大数据量的传输。
- 传输完毕后需要释放已建立的连接,发送数据的效率比较低。
TCP的三次握手和四次挥手
三次握手:
第一次:客户端发送请求到服务器,服务器知道客户端发送,自己接收正常。SYN=1,seq=x
第二次:服务器发给客户端,客户端知道自己发送、接收正常,服务器接收、发送正常。ACK=1,ack=x+1,SYN=1,seq=y
第三次:客户端发给服务器:服务器知道客户端发送,接收正常,自己接收,发送也正常.seq=x+1,ACK=1,ack=y+1
上面分析过程可以看出,如果是握手两次的话达不到让双方都得出自己、对方的接收、发送能力都正常的结论的。
四次挥手:
第一次:客户端请求断开FIN,seq=u
第二次:服务器确认客户端的断开请求ACK,ack=u+1,seq=v
第三次:服务器请求断开FIN,seq=w,ACK,ack=u+1
第四次:客户端确认服务器的断开ACK,ack=w+1,seq=u+1
UDP协议
用户数据报协议(User Datagram Protocol),是一种非面向连接的协议,类似于写信。
- 在通信的整个过程中不需要保持连接,其实是不需要建立连接。
- 不保证数据传输的可靠性和有序性。
- 是一种全双工的数据报通信方式,每个数据报的大小限制在64K内。
- 发送数据完毕后无需释放资源,开销小,发送数据的效率比较高,速度快。
IP地址
192.168.1.1 - 是绝大多数路由器的登录地址,主要配置用户名和密码以及Mac过滤。
IP地址是互联网中的唯一地址标识,本质上是由32位二进制组成的整数,叫做IPv4,当然也有128位二进制组成的整数,叫做IPv6,目前主流的还是IPv4。
日常生活中采用点分十进制表示法来进行IP地址的描述,将每个字节的二进制转化为一个十进制整数,不同的整数之间采用小数点隔开。
如:0x01020304 => 1.2.3.4查看IP地址的方式:
Windows系统:在dos窗口中使用ipconfig或ipconfig/all命令即可
Unix/linux系统:在终端窗口中使用ifconfig或/sbin/ifconfig命令即可
特殊的地址
本地回环地址(hostAddress):127.0.0.1 主机名(hostName):localhost
端口号
IP地址 - 可以定位到具体某一台设备。
端口号 - 可以定位到该设备中具体某一个进程。
端口号本质上是16位二进制组成的整数,表示范围是:0 ~ 65535,其中0 ~ 1024之间的端口号通常被系统占用,建议编程从1025开始使用。特殊的端口:
HTTP:80 FTP:21 Oracle:1521 MySQL:3306 Tomcat:8080
网络编程需要提供:IP地址 + 端口号,组合在一起叫做网络套接字:Socket。
基于tcp协议的编程模型
服务器:
-- java.net.ServerSocket类主要用于描述服务器套接字信息
(1)创建ServerSocket类型的对象并提供端口号;
(2)等待客户端的连接请求,调用accept()方法;
(3)使用输入输出流进行通信;
(4)关闭Socket;
常用的方法:
方法声明 | 功能介绍 |
---|---|
ServerSocket(int port) | 根据参数指定的端口号来构造对象 |
Socket accept() | 侦听并接收到此套接字的连接请求 |
void close() | 用于关闭套接字 |
客户端:
-- java.net.Socket类主要用于描述客户端套接字,是两台机器间通信的端点。
(1)创建Socket类型的对象并提供服务器的IP地址和端口号;
(2)使用输入输出流进行通信;
(3)关闭Socket;
常用的方法:
方法声明 | 功能介绍 |
---|---|
Socket(String host, int port) | 根据指定主机名和端口来构造对象 |
InputStream getInputStream() | 用于获取当前套接字的输入流 |
OutputStream getOutputStream() | 用于获取当前套接字的输出流 |
void close() | 用于关闭套接字 |
注意:
-- 客户端 Socket 与服务器端 Socket 对应, 都包含输入和输出流。
-- 客户端的socket.getInputStream() 连接于服务器socket.getOutputStream()。
-- 客户端的socket.getOutputStream()连接于服务器socket.getInputStream()
基于udp协议的编程模型
接收方:
(1)创建DatagramSocket类型的对象并提供端口号;
(2)创建DatagramPacket类型的对象并提供缓冲区;
(3)通过Socket接收数据内容存放到Packet中,调用receive方法;
(4)关闭Socket;
发送方:
(1)创建DatagramSocket类型的对象;
(2)创建DatagramPacket类型的对象并提供接收方的通信地址;
(3)通过Socket将Packet中的数据内容发送出去,调用send方法;
(4)关闭Socket;
相关类:
- java.net.DatagramSocket类主要用于描述发送和接收数据报的套接字(邮局)。换句话说,该类就是包裹投递服务的发送或接收点。
- java.net.DatagramPacket类主要用于描述数据报,数据报用来实现无连接包裹投递服务。
- java.net.InetAddress类主要用于描述互联网通信地址信息。
URL类
- java.net.URL(Uniform Resource Identifier)类主要用于表示统一的资源定位器,也就是指向万维网上“资源”的指针。这个资源可以是简单的文件或目录,也可以是对复杂对象的引用,例如对数据库或搜索引擎的查询等。
- 通过URL可以访问万维网上的网络资源,最常见的就是www和ftp站点,浏览器通过解析给定的URL可以在网络上查找相应的资源。
- URL的基本结构如下:
<传输协议>://<主机名>:<端口号>/<资源地址>- java.net.URLConnection类是个抽象类,该类表示应用程序和URL之间的通信链接的所有类的超类,主要实现类有支持HTTP特有功能的HttpURLConnection类。
网友评论