Java网络编程
网络基础
- 软件结构:
- C/S;Client/Server
- B/S;Browser/Server
网络协议
- TCP/IP协议;传输控制协议/因特网互联协议( Transmission Control Protocol/Internet Protocol)
- 应用层
- 传输层
- 网络层
- 数据链路层
- 物理层
- TCP;传输控制协议 (Transmission Control Protocol)。TCP协议是面向连接的通信协议,即传输数据之前,在发送端和接收端建立逻辑连接,然后再传输数据,它提供了两台计算机之间可靠无差错的数据传输。
- 三次握手:TCP协议中,在发送数据的准备阶段,客户端与服务器之间的三次交互,以保证连接的可靠
- 第一次:客户端—>服务器(发请求)
- 第二次:客户端<—服务器(返回响应)
- 第三次:客户端—>服务器(曲儿响应)
- 三次握手:TCP协议中,在发送数据的准备阶段,客户端与服务器之间的三次交互,以保证连接的可靠
- UDP;用户数据报协议(User Datagram Protocol)。UDP协议是一个面向无连接的协议。传输数据时,不需要建立连接,不管对方端服务是否启动,直接将数据、数据源和目的地都封装在数据包中,直接发送。每个数据包的大小限制在64k以内。它是不可靠协议,因为无连接,所以传输速度快,但是容易丢失数据。
IP地址
- IP地址:指互联网协议地址(Internet Protocol Address),俗称IP。IP地址用来给一个网络中的计算机设备做唯一的编号。
- IP分类:
- IPv4;是一个32位的二进制数,通常被分为4个字节,表示成
a.b.c.d
的形式,例如192.168.65.100
。其中a、b、c、d
都是0~255之间的十进制整数,那么最多可以表示42亿个是一个32位的二进制数,通常被分为4个字节,表示成a.b.c.d
的形式,例如192.168.65.100
。其中a、b、c、d
都是0~255之间的十进制整数,那么最多可以表示42亿个 - IPv6;采用128位地址长度,每16个字节一组,分成8组十六进制数,表示成
ABCD:EF01:2345:6789:ABCD:EF01:2345:6789
- IPv4;是一个32位的二进制数,通常被分为4个字节,表示成
- 本机IP地址:
127.0.0.1
、localhost
端口号
- 用两个字节表示的整数,它的取值范围是0~65535。其中,0~1023之间的端口号用于一些知名的网络服务和应用,普通的应用程序需要使用1024以上的端口号。如果端口号被另外一个服务或应用所占用,会导致当前程序启动失败。
- 常用端口号;
- 80;网络端口
- 3306;MySQL
- 1521;Oracle
- 8080:Tomcat
TCP通信
- 客户端和服务器端进行一个数据交互,需要4个IO流对象
- 服务器端必须明确;
- 多个客户端同时和服务器进行交互,服务器必须明确和哪个客户端进行的交互。在服务器端有个方法叫accept客户端获取到请求的客户端对象
- 多个客户端同时和服务器端进行交互,就需要使用多个IO流对象
- 服务器是没有IO流的,服务器可以获取到请求的客户端对象Socket。使用每个客户端Socket中提供的IO流和客户端进行交互(服务器使用客户端的流和客户端交互)
- TCP通信的客户端;向服务器发送连接请求,给服务i去发送数据,读取服务器回写的数据
Socket类
- 表示客户端的类;
java.net.Socket
;此类实现客户端套接字,套接字是两台机器之间通信的端点。套接字包含了IP地址和端口号的网络单位 - 构造方法:
Socket(String host,int port)
;创建一个流套接字并将其连接到指定主机上的指定端口号。- String host;服务器主机的名称/服务器的IP地址
- int port;服务器的端口号
- 成员方法;
OutputStream getOutputStream()
;返回此套接字的输出流InputStream getInputStream()
;返回此套接字的输入流void close()
;关闭此套接字
- 实现步骤;
- 创建一个客户端对象Socket,构造方法绑定服务器的IP地址和端口号
- 使用Socket对象中的方法getOutputStream()获取网络字节输出流OutputStream对象
- 使用网络字节输出流OutputStream对象中的方法write,给服务器发送数据
- 使用Socket对象中的方法getInputStream()获取网络字节输入流InputStream对象
- 使用网络字节输入流InputStream对象中的方法read,读取服务器回写的数据
- 释放资源(Socket)
- 注意;
- 客户端和服务器端进行交互,必须使用Socket中提供网络流,不能使用自己创建的流对象
- 当我们创建客户端对象Socket时,就会去请求服务器和服务器经过3次握手建立连接通路。如果服务器没有启动,则抛出异常,如果服务器启动,则进行交互
ServerSocket类
- 表示服务器的类;
java.net.ServerSocket
;此类实现服务器套接字 - 构造方法;
ServerSocket(int port)
;创建绑定到特定端口的服务器套接字
- 服务器端必须明确是哪个客户端请求的服务器,所以可以使用accpet方法获取到请求的客户端对象Socket
- 成员方法;
Socket accept()
;侦听并接收到此套接字的连接
- 实现步骤;
- 创建服务器ServerSocket对象和系统要指定的端口号
- 使用ServerSocket对象中的方法accpept获取到请求的客户端对象Socket
- 使用Socket对象中的方法getInputStream()获取网络字节输入流InputStream对象
- 使用网络字节输入流InputStream对象中的方法read,读取服务器回写的数据
- 使用Socket对象中的方法getOutputStream()获取网络字节输出流OutputStream对象
- 使用网络字节输出流OutputStream对象中的方法write,给客户端回写数据
- 释放资源(Socket、ServerSocket)
注意
- 上传完文件,给服务器写一个结束标记
void shutdownOutput()
;禁用次套接字的输出流。对于TCP套接字,任何以前写入的数据都将发送,并且后跟TCP的正常连接终止序列