一、网络编程三要素
1. 网络通信协议
- 物理层/数据链路层
- 网络层
- 传输层(TCP/IP、UDP、...协议)
- 应用层(HTTP、ftp、...协议)
2. IP地址
Ipv4 : 4个字节
Ipv6 :16个字节
3. 端口号
2个字节组成
范围在0-65535之间
Tips:
- 1024之前的端口号不能使用,已经被系统分配给已知的网络软件了
- 80端口 网络端口 www.baidu.com:80
- 数据库 MySql : 3306
- 数据库 Oracle : 1521
- Tomcat服务器 :8080
二、TCP通信协议
1. 概述
TCP通信是面向连接的通信,客户端和服务器端必须经过3次握手,建立逻辑连接,才能通信(安全)
2. 步骤
- 服务器端启动
- 客户端请求
- 建立一个连接,其中包含IO对象
- 客户端和服务器端可以使用这个IO对象进行通信
- 通信数据不仅仅是字符,因此IO对象是字节流对象
3. 表示
服务器端:ServerSocket类
客户端:Socket类
4. 图解
5. 套接字
java.net.Socket
此类实现客户端套接字(也称为套接字),套接字是两台机器间通信的端点
套接字: 包含了IP地址和端口号的网络单位
6.代码实现
1). 客户端实现
public static void main(String[] args) throws IOException{
//1.创建套接字对象,参数为服务器的名称或IP地址和服务器对应的端口号
Socket socket = new Socket("127.0.0.1",8888);
//2.获取套接字的输出流对象
OutputStream outputStream = socket.getOutputStream();
//3.使用输出流对象,给服务器发送数据
outputStream.write("你好服务器);
//4.读取服务器回写的数据
InputStream inputStream = socket.getInputStream();
byte[] bytes = new byte[1024];
int len = inputStream.read(bytes);
System.out.println(new String(bytes,0,len));
//5.释放资源
socket.close();
}
2). 服务器端实现
public class TCPServer{
public static void main(String[] args) throws IOException{
//1.创建指定端口号的服务器套接字
ServerSocket severSocket = new ServerSocket(8888);
//2. 使用服务器套接字的accept()方法,获取请求的客户端对象
Socket socket = serverSocket.accept();
//3. 使用获取到的客户端对象的getInputStream()方法获取字节输入流
InputStream inputStream = socket.getInputStream();
//4. 读取客户端发送的数据
byte[] bytes = new byte[1024];
int len = inputStream.read(bytes);
System.out.println(new String(bytes,0,len));
//5. 给客户端回写数据
OutputStream outputStream = socket.getOutputStream();
outputStream.write("收到谢谢".getBytes());
//6. 释放资源
socket.close();
serverSocket.close();
}
}