Java之网络编程基础
今天主要总结一下关于前段时间自学的网络编程的基础知识,带你了解网络通信协议和端口以及客户段和服务器端的连接。
网络通信协议的分层
名义上标准:ISO/OSI参考模型
事实上标准:TCP/IP协议栈(Internet使用的协议)
TCP通讯
定义:一种面向连接(连接导向)的、可靠的、基于字节流的运输层(Transport layer)通信协议
特点:
-
1、面向连接
2、点到点的通信
3、高可靠性:三次握手、
4、占用系统资源多、效率低
UDP通讯
定义:一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务
特点:
-
1、非面向连接,传输不可靠,可能丢失
2、发送不管对方是否准备好,接收方收到也不确认
3、可以广播发送
4、非常简单的协议,开销小
IP地址与端口
IP地址
定义:用来标志网络中的一个通信实体的地址。通信实体可以是计算机,路由器等。
IP地址分类
-
IPV4:32位地址,以点分十进制表示,如192.168.0.1
IPV6:128位(16个字节)写成8个16位的无符号整数,每个整数用四个十六进制位表示,数之间用冒号(:)分开,如:3ffe:3201:1401:1280:c8ff:fe4d:db39:1984
特殊的IP地址
-
127.0.0.1 本机地址
192.168.0.0–192.168.255.255私有地址,属于非注册地址,专门为组织机构内部使用。
端口(port)
-
IP地址用来标志一台计算机,但是一台计算机上可能提供多种应用程序,使用端口来区分这些应用程序。
-
端口是虚拟的概念,并不是说在主机上真的有若干个端口。通过端口,可以在一个主机上运行多个网络应用程序。
-
端口范围0—65535,16位整数
理解IP和端口的关系
-
IP地址好比每个人的地址(门牌号),端口好比是房间号。必须同时指定IP地址和端口号才能够正确的发送数据
-
IP地址好比为电话号码,而端口号就好比为分机号。
端口分类
-
公认端口 0—1023 比如80端口分配给WWW,21端口分配给FTP
注册端口 1024—49151 分配给用户进程或应用程序
动态/私有端口 49152–65535
InetAddress类
-
封装计算机的ip地址 ,没有端口
使用getLocalHost方法创建InetAddress对象
getHostAddress()返回计算机ip地址
getHostName()返回计算机名字
根据域名得到InetAddress对象
getByName(“网易”)
getHostAddress()返回 163服务器的ip:61.135.253.15
getHostName()输出:网易
根据ip得到InetAddress对象
InetAddress.getByName(“61.135.253.15”);
getHostAddress()返回 163服务器的ip:61.135.253.15
getHostName()
InetSocketAddress类 包含端口,用于socket通信的 URL(Uniform Resource Locator) 定义
统一资源定位符,由4部分组成:协议 、存放资源的主机域名、端口号和资源文件名。
URL是指向互联网“资源”的指针。
资源可以是简单的文件或目录,也可以是对更为复杂的对象的引用,例如对数据库或搜索引擎的查询。
Socket套接字
-
Socket实际是网络传输层供给应用层的编程接口。传输层则在网络层的基础上提供进程到进程问的逻辑通道,而应用层的进程则利用传输层向另一台主机的某一进程通信。
-
Socket就是应用层与传输层之间的桥梁
-
使用Socket编程可以开发客户机和服务器应用程序,可以在本地网络上进行通信,也可通过Internet在全球范围内通信。
TCP编程原理
TCP通信原理
-
1、服务器创建ServerSocket,在指定端口监听并并处理请求
-
2、客户端创建Socket,向服务器发送请求
TCP创建步骤
服务器端
TCP实现文件上传服务端:
-
1、定义服务端 ServerSocket(int port) 创建绑定到特定端口的服务器套接字。
-
2、阻塞式监听 一个客户端连接成功,就是一个socket
-
3、io操作 :从客户端读入数据 —>文件输出流 写出文件中
-
4、刷出
-
5、关闭
TCP实现文件上传客户端 :
-
1、定义客户端 Socket(String host, int port) 创建一个流套接字并将其连接到指定主机上的指定端口号。
-
2、IO操作 先从文件中读入数据–>写出数据
new FileInputStream("");
输出流OutputStream getOutputStream() 返回此套接字的输出流。 -
3、刷出
-
4、关闭
UDP基本概念
-
DatagramSocket:用于发送或接收数据包
-
DatagramPacket:数据包
网络登录功能分解
-
单向:客户端向服务器端发送字符串,服务器获取字符串并输出
-
双向:服务器端给出客户端反馈,客户端得到反馈并输出
-
对象:客户端向服务器端发送User对象,服务器端获取对象并输出
-
多线程:服务器接收多个客户端的请求,并给出反馈
-
每个客户请求开启一个线程
网络登录功能总结
1、服务器创建ServerSocket,在指定端口监听并并处理请求;
2、ServletSocket通过accept() 接收用户请求并返回对应的Socket,否则一种处于监听等待状态,线程也被阻塞
3、客户端创建Socket,需要指定服务器的ip和端口号,向服务器发送和接收响应
4、客户端发送数据需要输出流(写),客户端获取反馈数据需要输入流(读)
5、服务端反馈数据需要输出流(写),服务端获取请求数据需要输入流(读)
6、一旦使用ServerSocket和Socket建立了网络连接后,网络通信和普通IO流操作并没有太大区别
7、网络通信输出流建议使用DataOutputStream和ObjectOutputStream,与平台无关,输入流相应使用DataIntputStream和ObjectInputStream
8、如果是字符串通信也可以使用BufferedReader和PrintWriter,简单方便
UDP编程原理
发送端的基本流程: (发送端和服务端是平等的)
-
1、定义发送端 DatagramSocket(端口号) 指定发送端的端口号
-
2、准备数据
-
3、对数据打包 DatagramPacket(byte[] buf, int offset, int length, InetAddress address, int port)
构造数据报包,用来将长度为 length 偏移量为 offset 的包发送到指定主机上的指定端口号。 -
4、发送void send(DatagramPacket p)
-
5、关闭 void close() 关闭此数据报套接字。
接收端基本流程:
-
1、定义接收端 DatagramSocket(int port)
-
2、准备字节数组
-
3、准备包裹用来接收数据 DatagramPacket(byte[] buf, int length)
-
4、接收
-
5、从包裹中获取数据
1.byte[] getData() 返回数据缓冲区。
2 int getLength()
返回将要发送或接收到的数据的长度。 -
6、关闭