·TCP/IP协议:
传输控制协议/因特网互联协议(Transmission Control Protocol/Internet Protocol)。它定义了计算机如何连入因特网,以及数据如何在他们之间传输的标准。它采用了4层的分层模型:
1.链路层:链路层是用于定义物理传输通道,通常是对某些网络连接设备的驱动协议,例如针对光纤、网线提供的驱动。
2.网络层:网络层是整个TCP/IP协议的核心,它主要用于将传输的数据进行分组,将分组数据发送到目标计算机或者网络。
3.传输层:主要使网络程序进行通信,在进行网络通信时,可以采用TCP协议,也可以采用UDP协议。
4.应用层:主要负责应用程序的协议,例如HTTP协议,PTF协议等。
·网络通信协议的分类:
1-- UDP:用户数据报协议(User Datagram Protocal)。【数据报(Datagram):网络传输的基本单位】
-
UDP是无连接通信协议,即在数据传输时,数据的发送端和接收端不建立逻辑连接。简单来说,当一台计算机向另外一台计算机发送数据时,发送端不会确认接收端是否存在,就会发出数据,同样接收端在收到数据时,也不会向发送端反馈是否收到数据。
-
由于使用UDP协议消耗资源少,通信效率高,所以通常都会用于音频、视频和普通数据的传输例如视频会议都使用UDP协议,因为这种情况即使偶尔丢失一两个数据包,也不会对接受结果产生太大影响。
-
但是在使用UDP协议传送数据时,由于UDF的面向无连接性,不能保证数据的完整性,因此在传输重要数据时不建议使用UDP协议。UDP的交换过程如下图所示:
注意:其数据被限制在64KB以内,超出这个范围就不能发送了。
2-- TCP:传输控制协议(Transmission Control Protocol)。
- TCP协议是面向连接的通信协议,即传输数据之前,在发送端和接收端建立逻辑连接,然后再传输数据,它提供了两台计算机之间可靠无差错的数据传输。
- 在TCP连接中必须要明确客户端与服务器端,由客户端向服务器端发送连接请求,每次连接的创建都需要经过“三次握手”:
1-- 第一次握手:客户端向服务器端发出连接请求,等待服务器确认。
2-- 第二次握手:服务器端向客户端回送一个响应,通知客户端收到了连接请求。
3-- 第三次握手:客户端再次向服务器端发送确认信息,确认连接。
整个交互过程如下图所示:
·网络编程三要素:
1-- 协议
2-- IP地址:互联网协议地址(Internet Protocol Address )
- IP地址用来给一个网络中的计算机设备做唯一的编号。如果把“个人电脑”比作“一台电话”的话,那么“IP地址”相当于“电话号码”。
- IP地址分类:
1-- IPv4: 【4代表4个字节】是一个32位的二进制数,通常被分成4个字节,表示成a.b.c.d的形式,例如:192.168.65.100,其中a,b,c,d都是0-255之间的十进制整数,那么最多可以表示42亿个。
2-- IPv6: 【6代表16个字节】网络地址资源有限—扩大地址空间—拟通过IPv6重新定义地址空间,采用128位地址长度,每16个字节一组。分成8组16进制数,表示成:ABCD:EF01:2345:6789: ABCD:EF01:2345:6789 - 常用命令:
1-- 查看本机IP地址:ipconfig
2-- 检查网络是否连通:ping 空格 IP地址【例如:ping 220.181.57.216】 - 特殊的IP地址:
—本机IP地址:127.0.0.1、localhost
·
3-- 端口号
- 端口号是一个逻辑端口,我们无法直接看到,可以使用一些软件查看端口号。
- 当我们使用网络软件一打开,那么操作系统就会为网络软件分配一个随机的端口号,或者网络软件在打开的时候和系统要指定的端口号。
- 端口号是由两个字节组成,取值范围在0-65535之间【注意:1024之前的端口号我们不能使用,已经被系统分配给已知的网络软件了;网络软件的端口号不能重复】
- 常用的端口号:
1-- 80端口:网络端口 www.baidu.com:80正确的网址
2-- 数据库: mysql:3306; Oracle:1521
3-- Tomcat服务器:8080
TCP通信程序
两端【客户端,服务端】通信[步骤]:
- 服务端程序,需要事先启动,等待客户端的连接
- 客户端主动连接服务器端,连接成功才能通信。服务器端不可以主动连接客户端。
在这里需要注意,服务器必须明确两件事情: - 多个客户端可以同时和服务器进行交互,服务器必须明确和哪个客户端进行的交互----在服务器端有一个方法,叫accept客户端获取到请求的客户端对象。
- 多个客户端可以同时和服务器进行交互,就需要使用多个IO流对象-------服务器使用客户端的流和客户端交互。服务器是没有IO流的,服务器可以获取到请求的客户端对象Socket,使用每个客户端Socket中提供的IO流和客户端进行交互。即:服务器使用客户端的字节输入流读取客户端发送的数据,服务器使用客户端的字节输出流给客户端回写数据。
在Java中,提供了两个类用于实现TCP通信程序。
1-- 客户端:java.net.Socket类表示。创建Socket对象,向服务器端发送连接请求,服务器响应请求,两者建立连接开始通信。
2-- 服务端:java.net.ServerSocket类表示。创建ServerSocket对象,相当于开启一个服务,并等待客户端的连接。
一、TCP通信客户端的实现
注意:这里的代码实现和服务端实现相对应!!!!!!
/**
* TCP通信的客户端:向服务器发送请求,给服务器发送数据,读取服务器回写的数据
* 表示客户端的类:
* java.net.Socket:此类实现客户端套接字。套接字是两台机器间通信的端点。
* 套接字:包含了IP地址和端口号的网络单位
*
* 构造方法:
* Socket(String host, int port) 创建一个流套接字并将其连接到指定主机上的指定端口。
* 参数:
* String host:服务器主机的名称/服务器的IP地址
* int port:服务器的端口号
*
* 成员方法:
* OutputStream getOutputStream() 返回此套接字的输出流
* InputStream getInputStream() 返回此套接字的输入流
* void close() 关闭此套接字
*
* 实现步骤:
* 1.创建一个客户端对象Socket,构造方法绑定服务器的IP地址和端口号
* 2.使用Socket对象中的方法getOutputStream()获取网络字节输出流OutputStream对象
* 3.使用网络字节输出流OutputStream对象中的方法write,给服务器发送数据
* 4.使用Socket对象中的方法getInputStream()获取网络字节输出流InputStream对象
* 5.使用网络字节输出流InputStream对象中的方法read,读取服务器回写的数据
* 6.释放资源(Socket)
*
* 注意:
* 1.客户端和服务器端进行交互,必须使用Socket中提供的网络流,不能使用自己创建的对象流
* 2.当我们创建客户端对象Socket的时候,就会去请求服务器和服务器经过3次握手建立连接通路
* 这时,如果服务器没有启动,那么就会抛出异常
* 如果服务器已经启动,那么就可以进行交互了
*/
public class TcpClient {
public static void main(String[] args) throws IOException {
//1.创建一个客户端对象Socket,构造方法绑定服务器的IP地址和端口号
Socket socket = new Socket("127.0.0.1",8888);
//2.使用Socket对象中的方法getOutputStream()获取网络字节输出流OutputStream对象
OutputStream os = socket.getOutputStream();
//3.使用网络字节输出流OutputStream对象中的方法write,给服务器发送数据
os.write("你好,服务器!".getBytes());
//4.使用Socket对象中的方法getInputStream()获取网络字节输出流InputStream对象
InputStream is = socket.getInputStream();
//5.使用网络字节输出流InputStream对象中的方法read,读取服务器回写的数据
byte[] bytes = new byte[1024];
int len = is.read(bytes);
System.out.println(new String(bytes,0,len));
//6。释放资源(Socket)
socket.close();
}
}
二、TCP通信服务器端实现
/**
* TCP通信的服务器端:接收客户端的请求,读取客户端发送的数据,给客户端回写数据
* 表示服务器的类:
* java.net.ServerSocket: 此类实现服务器套接字
*
* 构造方法:
* ServerSocket(int port) 创建绑定到特定服务器端口的服务器套接字
*
* 服务器端必须明确一件事:必须知道是哪个客户端请求的服务器,所以可以使用accept方法获取到请求的服务端对象Socket
*
* 成员方法:
* Socket accept() 侦听并接收到此套接字的连接
*
* 服务器的实现步骤:
* 1.创建服务器ServerSocket对象和系统要指定的端口号
* 2.使用ServerSocket对象中的方法accept,获取到请求的客户端对象Socket
* 3.使用Socket对象中的方法getInputStream()获取网络字节输出流InputStream对象
* 4.使用网络字节输出流InputStream对象中的方法read,读取客户端发送的数据
* 5.使用Socket对象中的方法getOutputStream()获取网络字节输出流OutputStream对象
* 6.使用网络字节输出流OutputStream对象中的方法write,给客户端回写数据
* 7.释放资源(Socket,ServerSocket)
*
*
*/
public class TcpServer {
public static void main(String[] args) throws IOException {
//1.创建服务器ServerSocket对象和系统要指定的端口号
ServerSocket server = new ServerSocket(8888);
//2.使用ServerSocket对象中的方法accept,获取到请求的客户端对象Socket
Socket socket = server.accept();
//3.使用Socket对象中的方法getInputStream()获取网络字节输出流InputStream对象
InputStream is = socket.getInputStream();
//4.使用网络字节输出流InputStream对象中的方法read,读取客户端发送的数据
byte[] bytes = new byte[1024];
int len = is.read(bytes);
System.out.println(new String(bytes,0,len));
//5.使用Socket对象中的方法getOutputStream()获取网络字节输出流OutputStream对象
OutputStream os = socket.getOutputStream();
//6.使用网络字节输出流OutputStream对象中的方法write,给客户端回写数据
os.write("收到,谢谢!!".getBytes());
//7.释放资源(Socket,ServerSocket)
socket.close();
server.close();
}
}