- C/S结构:客户端/服务器结构
- B/S结构:浏览器/服务器结构
- 网络通信协议:在计算机网络中连接和通信的规则称为网络通信协议
- TCP/IP协议:传输互联协议/因特网互联协议是最基本最广泛的协议
-
UDP协议:用户数据报协议,是一个面向无连接的协议,消耗资源小、通信效率高,一般用于音频视频和普通数据的传输,不能保证数据的完整性
特点:数据被限制在64kb以内
-
TCP协议:传输控制协议,是一个面向连接的通信协议,先建立逻辑连接再发送数据,提供了可靠无差错的数据传输
创建连接需要“三次握手”
- 客户端向服务端发送连接请求,等待服务器确认
- 服务端向客户端回应一个响应,通知客户端收到请求
- 客户端再次向服务端发送确认信息,确认连接
通过三次握手可以保证数据传输的安全,一般用于文件上传、文件下载、网页浏览等
-
协议
计算机网络通信中必须遵守的规则
-
IP地址
互联网的协议地址,是计算机在一个网络中唯一的编号
-
IPv4:32位的二进制数,通常被分为4个字节0-255之间的十进制整数
-
IPv6:128位的二进制数,通常被分为8组十六进制数
本机ip地址:127.0.0.1、localhost
-
端口号
用两个字节表示的整数,可以唯一标识设备中的进程,范围是0-65535
1024之前的端口号用于知名的网络服务和应用
- 服务端程序需要事先启动,等待客户端连接
- 客户端主动连接服务器端,连接成功才能通信
在Java中,客户端使用java.net.Socket类,服务端使用java.net.ServerSocket类
注意:
- 多个客户端同时和服务端交互,服务端必须明确和哪个客户端进行交互
- 多个客户端同时和服务端交互,就需要使用多个IO流对象(获取到客户端的Socket,使用客户端的IO流进行交互)
java.net.Socket类实现客户端套接字
-
构造方法
Socket(String host, int port):创建一个流套接字并将其连接到指定主机上的指定端口号 -
成员方法
OutputStream getOutputStream():返回此套接字的输出流InputStream getInputStream():返回此套接字的输入流void close():关闭此套接字 -
实现步骤
(1)创建一个客户端对象Socket,构造方法中指定服务器的ip地址和端口号
(2)使用Socket对象中的方法getOutputStream获取网络字节输出流对象
(3)使用网络字节输出流对象的write方法给服务器发送数据
(4)使用Socket对象中的方法getInputStream获取网络字节输入流对象
(5)使用网络字节输入流对象的read方法读取服务器回写的数据
(6)释放资源(close)
-
注意:
(1)客户端和服务端进行交互,必须使用Socket中提供的网络流,不能使用自己创建的流对象
(2)当客户端创建Socket对象时就会请求服务器
java.net.ServerSocket类实现服务端套接字
-
构造方法
ServerSocket(int port):创建绑定到特定端口号的服务器套接字 -
成员方法
Socket accept():监听并接受到此套接字的连接 -
实现步骤
(1)创建一个服务端对象ServerSocket,构造方法中指定端口号
(2)使用ServerSocket对象中的方法accpet获取请求的客户端Socket对象
(3)使用Socket对象中的方法getInputStream获取网络字节输入流对象
(4)使用网络字节输入流对象的read方法读取客户端发送的数据
(5)使用Socket对象中的方法getOutputStream获取网络字节输出流对象
(6)使用网络字节输出流对象的write方法给客户端回写数据
(6)释放资源(close)
作者:意识流丶 链接:https://www.jianshu.com/p/0a1f8fe54ee1 来源:简书 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
UDP协议(用户数据报协议)是无连接的、不可靠的、无序的,速度快
进行数据传输时,首先将要传输的数据定义成数据报(Datagram),大小限制在64k,在数据报中指明数据索要达到的Socket(主机地址和端口号),然后再将数据报发送出去
DatagramPacket类:表示数据报包
DatagramSocket类:进行端到端通信的类
- 服务器端实现步骤
- 创建DatagramSocket,指定端口号
- 创建DatagramPacket
- 接受客户端发送的数据信息
- 读取数据
public class UDPServer {
public static void main(String[] args) throws IOException {
/*
* 接收客户端发送的数据
*/
//1.创建服务器端DatagramSocket,指定端口
DatagramSocket socket=new DatagramSocket(8800);
//2.创建数据报,用于接收客户端发送的数据
byte[] data =new byte[1024];//创建字节数组,指定接收的数据包的大小
DatagramPacket packet=new DatagramPacket(data, data.length);
//3.接收客户端发送的数据
System.out.println("****服务器端已经启动,等待客户端发送数据");
socket.receive(packet);//此方法在接收到数据报之前会一直阻塞
//4.读取数据
String info=new String(data, 0, packet.getLength());
System.out.println("我是服务器,客户端说:"+info);
/*
* 向客户端响应数据
*/
//1.定义客户端的地址、端口号、数据
InetAddress address=packet.getAddress();
int port=packet.getPort();
byte[] data2="欢迎您!".getBytes();
//2.创建数据报,包含响应的数据信息
DatagramPacket packet2=new DatagramPacket(data2, data2.length, address, port);
//3.响应客户端
socket.send(packet2);
//4.关闭资源
socket.close();
}
}- 客户端实现步骤
- 定义发送信息
- 创建DatagramPacket,包含将要发送的信息
- 创建DatagramSocket
- 发送数据
public class UDPClient {
public static void main(String[] args) throws IOException {
/*
* 向服务器端发送数据
*/
//1.定义服务器的地址、端口号、数据
InetAddress address=InetAddress.getByName("localhost");
int port=8800;
byte[] data="用户名:jinbin;密码:1997".getBytes();
//2.创建数据报,包含发送的数据信息
DatagramPacket packet=new DatagramPacket(data, data.length, address, port);
//3.创建DatagramSocket对象
DatagramSocket socket=new DatagramSocket();
//4.向服务器端发送数据报
socket.send(packet);
/*
* 接收服务器端响应的数据
*/
//1.创建数据报,用于接收服务器端响应的数据
byte[] data2=new byte[1024];
DatagramPacket packet2=new DatagramPacket(data2, data2.length);
//2.接收服务器响应的数据
socket.receive(packet2);
//3.读取数据
String reply=new String(data2, 0, packet2.getLength());
System.out.println("我是客户端,服务器说:"+reply);
//4.关闭资源
socket.close();
}
}