网络通信三要素
网络通信协议(OSI七层协议、TCP/IP四层协议):
- 物理链路层:
- 网络层:ICMP/IGMP/IP/ARP/RARP
- 传输层:TCP/UDP()
- 应用层:HTTP/SMTP/FTP/DNS
java.net
包提供了两种常见的网络协议的支持:TCP/UDP
网络编程三要素:协议、IP地址、端口号
IP地址:
- IPv4:32位,4组,每组1个字节,2011年已经分配完毕
- IPv6:128位,8组,每组16个字节,
ABCD:EF01:2345:6789:ABCD:EF01:2345:6789
端口号:
- 取值0-66535,其中0-1023已被知名网络服务占用,普通应用程序使用1024以上的端口号。
TCP通信
在Java中,提供了两个类用于实现TCP通信:
- 客户端:
java.net.Socket
类表示。创建Socket
对象,向服务端发出连接请求,服务端响应请求,两者建立连接开始通信。 - 服务端:
java.net.ServerSocket
类表示。创建ServerSocket
对象,相当于开启一个服务,并等待客户端的连接。
客服端和服务器交换通过IO流,服务器必须明确两件事:
- 通过
accept()
获取客户端对象; - 服务器本身没有IO流,但是可以使用客服端的IO流和客户端交互。
简单的TCP通信
客户端编程:
- 【创建对象】创建客户端对象
Socket(ip, port)
,本机IP和端口号; - 【获取输出流】使用
Socket
的getOutputStream()
获取输出流OutputStream
的对象; - 【发送数据】使用
OutputStream
的write()
给数据给服务器; - 【获取输入流】使用
Socket
的getInputStream()
获取输入流InputStream
的对象; - 【读数据】使用
InputStream
的read()
获取服务器的数据; - 【释放资源】释放资源
socket.close();
。
服务器编程:
- 【创建对象】创建服务器对象
ServerSocket(端口号)
; - 【获取客户端】使用
ServerSocket
的accept()
获取客户端对象Socket
; - 【获取输入流】使用
Socket
的getInputStream()
获取输入流InputStream
的对象; - 【获取数据】使用
InputStream
的read()
获取客服端发送的数据; - 【获取输出流】使用
Socket
的getOutputStream()
获取输出流OutputStream
的对象; - 【返回数据】使用
OutputStream
的write()
给客户端发送数据; - 【释放资源】释放资源
socket.close()
和server.close()
。
先写服务器代码,然后开启服务器:
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class TCPServer {
public static void main(String[] args) throws IOException {
// 1. 创建对象
ServerSocket server = new ServerSocket(8888);
// 2. 获取客户端
Socket socket = server.accept();
// 3. 获取输入流
InputStream input = socket.getInputStream();
byte[] bytes = new byte[1024];
// 4. 获取数据
int len = input.read(bytes);
System.out.println(new String(bytes, 0, len));
// 5. 获取输出流
OutputStream output = socket.getOutputStream();
// 6. 返回数据
output.write("我是服务器".getBytes());
// 7. 释放资源
socket.close();
server.close();
}
}
客户端代码,开启客服端:
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
public class TCPClient {
public static void main(String[] args) throws IOException {
// 1. 创建对象
Socket socket = new Socket("127.0.0.1", 8888);
// 2. 获取输出流
OutputStream output = socket.getOutputStream();
// 3. 发送数据
output.write("你是谁".getBytes());
// 4. 获取输入流
InputStream input = socket.getInputStream();
byte[] bytes = new byte[1024];
// 5. 读数据
int len = input.read(bytes);
System.out.println(new String(bytes, 0, len));
// 6. 释放资源
socket.close();
}
}