网络编程就是指编写互联网项目,项目可以通过网络传输数据进行通讯
网络编程最主要的工作就是在发送端把信息通过规定好的协议进行组装包,在接收端按照规定好的协议把包进行解析,从而提取出对应的信息,达到通信的目的
1.1 软件结构
1.1.1 C/S结构
全称为Client/Server结构,是指客户端和服务器结构(QQ、迅雷等软件)
1.1.2 B/S结构
全称为Browser/Server结构,是指浏览器和服务器结构(谷歌、火狐)
两种架构各有优势,但是无论哪种架构,都离不开网络的支持。网络编程就是在一定的协议下,实现两台计算机的通信的程序。
1.2 网络编程三要素
通过ip地址找到主机,通过端口号找到对应程序
1.2.1 IP地址
IP地址是IP协议提供的一种统一的地址格式,它为互联网上的每一个网络和每一台主机分配一个逻辑地址,以此来屏蔽物理地址的差异,主要的作用是在网络通讯时用来找到指定的网络设备
目前有两种IP地址,IPv4与IPv6
1.2.1.1 常用命令
查看本机IP地址,在控制台输入
ipconfig
检查网络是否连通,在控制台输入
ping 空格 IP地址
ping 220.181.57.216
1.2.1.2 特殊的IP地址
本机IP地址:127.0.0.1
、localhost
。
1.2.2 端口号
客户端可以通过ip地址找到对应的服务器端,但是服务器端是有很多端口的,每个应用程序对应一个端口号,通过端口号,客户端才能真正的访问到该服务器,端口号范围是从0 到65535
其中,0~1023之间的端口号用于一些知名的网络服务和应用,普通的应用程序需要使用1024以上的端口号
常见端口号: | |
---|---|
服务 | 默认端口号 |
HTTP | 80 |
HTTPS | 443 |
开发服务器 | 8080 |
MySQL数据库 | 3306 |
SSH(Secure Shell) | 22 |
1.2.3 网络协议
网络协议为计算机网络中进行数据交换而建立的规则、标准或约定的集合
1.3 网络协议
1.3.1 OSI七层模型
1.3.2 TCP/IP五层模型
是Internet最基本、最广泛的协议。它定义了计算机如何连入因特网,以及数据如何在它们之间传输的标准。它的内部包含一系列的用于处理数据通信的协议,并采用了5层的分层模型,每一层都呼叫它的下一层所提供的协议来完成自己的需求。
1.3.3 UDP(User Datagram Protocol )用户数据报协议
UDP是一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务,主要用于不要求分组顺序到达且数据量少的传输中,分组传输顺序的检查与排序和传输的可靠性由应用层负责;虽然UDP不可靠,但正是因为它控制选项较少,数据传输效率才高
1.3.3.1 发送端开发
public class Sender {
public static void main(String[] args) throws IOException {
//1 创建用于UDP协议发送数据的Scoket对象 快递员
DatagramSocket datagramSocket = new DatagramSocket();//遵守UDP协议的Scoket
//2 准备数据
String data = "hello"; //寄的东西
//3 准备接收端的IP地址
InetAddress ip = InetAddress.getByName("172.16.4.255");//收件人的地址
//4 将数据封装到数据包里面 //打包
//参数1 发送的数据,二进制的形式发送,网络数据传输都是以byte类型进行传输
//参数2 发送数据的长度
//参数3 接收端的地址
//参数4 端口号
DatagramPacket packet = new DatagramPacket(
data.getBytes(),
data.getBytes().length,
ip,
8080);
//5 发送数据
datagramSocket.send(packet);
//6 关闭scoket
datagramSocket.close();
}
}
1.3.3.2 接收端开发
public class Received {
public static void main(String[] args) throws IOException {
//1 获得scoket 跟快递员取得联系
DatagramSocket datagramSocket = new DatagramSocket(8080);//指定接收数据的端口号
//2 创建保存数据的东西
byte[] data = new byte[1024];
//3 让存储数据的与数据包建立关系,数据包接收到数据之后,应该将数据存放到什么位置
DatagramPacket packet = new DatagramPacket(data, data.length);
//4 接收数据
datagramSocket.receive(packet);
System.out.println("接收到:"
+new String(data,0,packet.getLength()));
//packet.getLength()获得接收到数据的长度
//5 关闭scoket
datagramSocket.close();
}
}
1.3.4 TCP(Transmission Control Protocol)传输控制协议
TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议,
1.3.4.1 客户端开发
public class Client {
public static void main(String[] args) throws UnknownHostException, IOException {
//1 创建遵守TCP协议的socket
//在这里已经帮我们与服务器进行连接
Socket socket = new Socket(InetAddress.getByName("172.16.4.123"), 9000);
//2 获取socket的输出流对象
OutputStream out = socket.getOutputStream();
//3 发送数据
out.write("服务器你好,我是客户端".getBytes());
//关闭输出流,告知服务器客户端数据发送完毕
socket.shutdownOutput();
//接收服务发送回来的消息
InputStream inputStream = socket.getInputStream();
//4 通过字节流对象获取客户端发送来的消息
byte[] data = new byte[1024];
int length = 0;
length = inputStream.read(data);
System.out.println("接收到服务器的消息:"+new String(data,0,length));
//4 关闭
socket.close();
}
}
1.3.4.2 服务器端开发
public class Server {
public static void main(String[] args) throws IOException {
//1 创建socket
ServerSocket serverSocket = new ServerSocket(9000);
//2 接受客户端的连接,获取到客户端发送过来的scoket
Socket socket = serverSocket.accept();//这里的socket就是客户端发送过来的socket
//3 获取socket的输入流对象
InputStream inputStream = socket.getInputStream();
//4 通过字节流对象获取客户端发送来的消息
byte[] data = new byte[1024];
int length = 0;
length = inputStream.read(data);
System.out.println("服务器接收到:"+new String(data,0,length));
//向客户端发送数据
OutputStream outputStream = socket.getOutputStream();
outputStream.write("干啥".getBytes());
//5 关闭
serverSocket.close();
}
}