目录
一、网络编程
1. 网络编程的三要素
- IP 地址:唯一标识网络上的每一台计算机,两台计算机之间的通信必备要素。
- 端口号:计算机中应用的标号(代表一个应用程序),计算机上可能运行着很多程序,那具体是和哪一个程序通信呢?
- 通信协议:规定通信双发的数据规则。只有相同网络协议的计算机才能进行信息的沟通与交流。这就好比人与人之间交流所使用的各种语言一样,只有使用相同语言才能正常、顺利地进行交流。
2. 网络分层
(1)通信协议的分层
(2)封装
从上往下,加入相关层的协议控制信息。
(3)拆封
获取数据,从下往上,去除相关层的协议的控制信息。
3. IP位置
(1)基本概念
IP 是 Internet Protocol 的外语缩写, 网络之间互连的协议也就是为计算机网络相互连接进行通信而设计的协议,IP是唯一的,同一局域网内不可重复。
(2)常用IP
0.0.0.0:本机
127.0.0.1:本机回环地址,用于本机测试
255.255.255.255:当前子网,一般用于向当前子网广播信息
(3)IP的工具类
IP 它是一种低级协议,UDP 和 TCP 协议都是在它的基础上构建的。
4. 端口 port
(1)概念
1)端口是虚拟的概念,通过端口,可以在一个主机上运行多个网络应用程序。
2)端口:区分数据流向的软件 0-65535 不要使用 1024 以下的端口 ,每一个协议拥有自己的端口,在同一个协议下端口不能重复 FTP:21, HTTP:80,mysql:3306,oracle:1521
(2)端口的工具类
5. 资源的传输协议
(1)TCP
TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。TCP 层是位于 IP 层之上,应用层之下的中间层。例如:打电话 面向连接、安全、可靠,效率低。
(2)UDP
UDP(UserDatagramProtocol ) UDP 协议全称是用户数据报协议 ,在网络中它与 TCP协议一样用于处理数据包,是一种无连接的协议。在 OSI 模型中,在第四层——传输层,处于 IP 协议的上一层。缺点是当报文发送之后,是无法得知其是否安全完整到达的。
6. Socket 编程
(1)InetAddress
封装计算机的 ip 地址和 DNS( Domain Name System,域名系统) ,没有端口。
1)方法:
getHostAddress() 返回 ip 地址
getByName() 返回域名|本机为计算机名
2)例如
public static void main(String[] args) throws UnknownHostException {
InetAddress add = InetAddress.getByName("www.taobao.com");
System.out.println("IP为: " + add.getHostAddress());
InetSocketAddress add2 = new InetSocketAddress("www.taobao.com", 8080);
System.out.println(add2);
}
(2)InetSocketAddress
包含主机和端口,用于 socket 通信的。
1)获取对象
InetSocketAddress(String hostname, int port)
InetSocketAddress(InetAddress addr, int port)
2)方法
getAddress() 返回 InetAddress 对象
getPort() 返回端口
getHostName() 返回域名
IP 地址+端口号组成了所谓的 Socket,Socket 是网络上运行的程序之间双向通信链路的终结点,是 TCP 和 UDP 的基础。
3)示范
public static void main(String[] args) throws UnknownHostException {
InetSocketAddress add2 = new InetSocketAddress("www.taobao.com", 8080);
System.out.println(add2);
}
(3) UDP编程
1)概念
UDP 是 User Datagram Protocol 的简称,是一种无连接的协议,每个数据报都是一个独立的信息,大小限制在 64k,包括完整的源地址或目的地址,它在网络上以任何可能的路径传往目的地,因此能否到达目的地,到达目的地的时间以及内容的正确性都是不能被保
证的。
- DatagramPacket 类:表示数据报包
- DatagramSocket 类:进行端到端通信的类,此类表示用来发送和接收数据报包的套接字。
2)服务器端实现步骤(接收)
- ① 创建 DatagramSocket,指定端口号
- ② 创建 DatagramPacket
- ③ 接受客户端发送的数据信息
- ④ 读取数据
3)客户端实现步骤(发送)
- ① 定义发送信息
- ② 创建 DatagramPacket,包含将要发送的信息
- ③ 创建 DatagramSocket
- ④ 发送数据
对于同一个 socket,如果关闭了输出流,则与该输出流关联的 socket 也会被关闭,所以一般不用关闭流,直接关闭 socket 即可。
4)代码示范
需求:示范两台电脑用户间的相互交流
/**
* 实现两台电脑用户之间的交流
* 持续接收和回复
*/
public class Task05 {
public static void main(String[] args) throws Exception {
while (true) {
server();
client();
}
}
/**
* 客户端实现步骤(发送)
* 1.定义发送信息
* 2.创建 DatagramPacket,包含将要发送的信息
* 3.创建 DatagramSocket
* 4.发送数据
*/
public static void client() throws IOException {
// 准备数据
Scanner sc = new Scanner(System.in);
System.out.println("请输入您要发送的信息");
byte[] strByte = sc.nextLine().getBytes();
InetAddress addr = InetAddress.getByName("192.168.2.122");
// 创建 DatagramPacket,包含将要发送的信息
DatagramPacket packet = new DatagramPacket(strByte, strByte.length, addr, 11111);
// 创建一个可以发送数据报包的工具 DatagramSocket
DatagramSocket client = new DatagramSocket();
// 发送数据
client.send(packet);
client.close();
}
/**
* 服务器端实现步骤(接收)
* 1.创建 DatagramSocket,指定端口号
* 2.创建 DatagramPacket
* 3.接受客户端发送的数据信息
* 4.读取数据
*/
public static void server() throws IOException {
System.out.println("server");
// 创建一个DatagramSocket 指定端口
DatagramSocket server = new DatagramSocket(11111);
// 创建一个DatagramPacket 数据报包
byte[] buf = new byte[1024];
DatagramPacket packet = new DatagramPacket(buf, 1024);
server.receive(packet);
// 实际接收到的数据的长度
int len = packet.getLength();
// 数据的处理(buf, len)
String str = new String(buf, 0, len);
System.out.println(str);
server.close();
}
}
二、TCP编程
TCP 是 Tranfer Control Protocol 的 简称,是一种面向连接的保证可靠传输的协议。
1. 特点
- 发送方和接收方的成对的两个socket 之间必须建立连接,即请求-响应”模式;
- 基于 tcp 协议,建立稳定连接的点对点的通信;
- 实时、快速、安全性高、占用系统资源多、效率低。
2. 主体
- 客户端:在网络通讯中,第一次主动发起通讯的程序被称作客户端(Client)程序。
- 服务器:第一次通讯中等待连接的程序被称作服务器端(Server)程序。
3. 服务器
- 创建服务器,指定端口;
- 等待客户端连接;
- 分析接收数据。
4. 客户端
- 连接服务器: 创建客户端 +指定服务器地址 +端口;
- 发送数据。
5. 示例
利用TPC编程模式简单实现服务端与客户端之间的无障碍交流对话。(需要用到多线程)。
实现效果:
**
* 服务端:
* 1.等待客户链接
* 2.创建两个线程,发送数据和接收数据
*
*/
public class TCPCharServerTest03 {
public static void main(String[] args) throws Exception {
ServerSocket server = new ServerSocket(15415);
Socket client = server.accept();
System.out.println("Server: ");
// 消息发送
new SendThread(client).start();
// 消息接收
new AcceptThread(client).start();
}
}
/**
* 消息发送的线程
*/
class SendThread extends Thread {
// 接收端的socket信息
private Socket socket;
// 输出流(目的地为对端)
private OutputStream os;
// 填写信息的工具
private Scanner sc = new Scanner(System.in);
// 发送数据的数组
byte[] msg;
public SendThread(Socket socket) throws Exception {
this.socket = socket;
this.os = socket.getOutputStream();
}
//线程方法体
@Override
public void run() {
while (true) {
msg = sc.nextLine().getBytes();
try {
os.write(msg, 0, msg.length);
os.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
/**
* 消息接收的线程
*/
class AcceptThread extends Thread {
// 发送端的socket信息
private Socket socket;
// 发送方的输入流(源头为发送方)
private InputStream is;
// 接收数据准备的空间
private byte[] msg = new byte[1024];
// 谁给我socket我就接收谁的信息
public AcceptThread(Socket socket) throws Exception {
this.socket = socket;
is = socket.getInputStream();
}
//线程方法体
@Override
public void run() {
while (true) {
// 接收数据到准备的空间中
try {
int len = is.read(msg, 0, msg.length);
System.out.println(new String(msg, 0, len));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
/**
* 客户端:
* 1、主动连接服务端
* 2、创建两个线程,发送数据和接收数据
*
*/
public class TCPCharClientTest03 {
public static void main(String[] args) throws Exception {
InetAddress addr = InetAddress.getByName("127.0.0.1");
Socket serverInfo = new Socket(addr, 15415);
System.out.println("Client: ");
// 消息接收
new AcceptThread(serverInfo).start();
// 消息发送
new SendThread(serverInfo).start();
}
}
6. UDP编程与TCP编程的比较
(1)UDP
- 每个数据报中都给出了完整的地址信息,因此无需要建立发送方和接收方的连接;
- UDP 传输数据时是 有大小限制的,每个被传输的数据报必须限定在 64KB 之内;
- UDP 是一个不可靠的协议,发送方所发送的数据报并不一定以相同的次序到达接收方。
(2)TCP
- 面向连接的协议,在 socket 之间进行数据传输之前必然要建立连接,所以在 TCP中需要连接时间;
- TCP 传输数据大小限制,一旦连接建立起来,双方的 socket 就可以按统一的格式传输大的数据;
- TCP 是一个可靠的协议,它确保接收方完全正确地获取发送方所发送的全部数据。