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的正常连接终止序列