1、网络模型
OSI参考模型:应用层 表示层 会话层 传输层 网络层 数据链路层 物理层
TCP/IP参考模型:应用层 传输层 网际层 主机至网络层
OSI七层简述:
物理层:主要定义物理设备标准,如网线接口类型、光纤接口类型、各种传输介质的传输速率等等
。主要作用是传输比特流(将1、0转换为电流强弱)
数据链路层:主要是将从物理层接收到的数据进行MAC地址的封装和解封装。这一层工作的
设备是交换机
网络层:主要将从下层接收到的数据进行ip地址的封装和解封装。这一层的主要设备是路由器。
路由器进行数据包传播方向的定义
传输层:定义了一些传输数据的协议和端口号(TCP/UDP)
会话层:通过传输层建立数据传输的通路
表示层:对接受数据进行解释、加密和解密、压缩和解压缩
应用层:主要对应计算机的应用软件,即终端应用
2、网络通讯要素
IP地址
(1)网络中的设备的标识
(2)不易记忆,可用主机名
(3)本地回环地址:127.0.0.1 主机名:localhost
端口号
(1)用于标识进程的逻辑地址,不同进程的标识
(2)有效端口:0~65535,其中0~1024是系统使用或保留端口
传输协议
(1)通讯规则
(2)常见协议:TCP UDP
3、TCP与UDP协议的区别
TCP:传输控制协议 打电话、下载数据、
(1)建立连接,形成传输数据通道
(2)在连接中进行大量数据传输
(3)通过三次握手完成连接,是可靠协议(a:哥们你在吗?b:我在。a:好,我知道你在了。)
(4)必须建立连接,效率会稍低
UDP: 对讲机 QQ聊天 在线视频聊天 以速度快为主,不可靠,对方可能不在线
(1)将数据及源和目的封装成数据包,不需要建立连接
(2)每个数据包的大小限制在64k内
(3)因无连接,是不可靠协议
(4)不需要建立连接,速度快
4、什么是socket
Socket(套接字)
(1)Socket就是为网络服务提供的一种机制
(2)通信的两端都有Socket
(3)网络通信其实就是Socket间的通信
(4)数据在两个Socket间通过IO传输
下面使用java进行简单的socket通信,通信协议分为TCP和UDP
java中使用udp进行数据发送,用到的api主要是java.net包下的,代码示例如下:
发送端代码:
import java.io.IOException;import java.net.DatagramPacket;import java.net.DatagramSocket;import java.net.Inet6Address;public class UDPSendDemo { /* * 创建UDP传输的发送端。 思路: (1)建立UDP的socket服务 * (2)将要发送的数据封装到数据包中 * (3)通过UDP的socket服务将数据包发送出去 * (4)关闭socket服务 */ public static void main(String[] args) throws IOException { System.out.println("发送端启动......"); //启动socket服务 DatagramSocket socket = new DatagramSocket(); //需要发送的数据 String str = "你是**?"; byte[] bt = str.getBytes(); //需要发送的数据包,里面封装了数据内容、数据大小、目的地ip地址、目的地应用程序的端口号 DatagramPacket dp = new DatagramPacket(bt, bt.length,Inet6Address.getByName("fe80::c93c:a4cb:e167:cb7e%14"), 10000); System.out.println(dp.getAddress().getHostAddress()); //发送数据包 socket.send(dp); //关闭socket服务 socket.close(); }}
接收端代码:
import java.io.IOException;import java.net.DatagramPacket;import java.net.DatagramSocket;public class UDPReceiveDemo { /* * 建立UDP接收端的思路: * (1)建立UDP socket服务 * (2)创建数据包,用于存储接收到的数据,方便用数包对象的方法解析这些数据 * (3)使用socket服务的receive方法将接收到的数据存储到数据包中 * (4)通过数据包的方法解析数据包中的数据 (5)关闭资源 */ public static void main(String[] args) throws IOException { System.out.println("接收端启动......"); //创建socket服务并设置端口号 DatagramSocket socket = new DatagramSocket(10000); //创建一个数据包勇于接收数据 byte[] buf = new byte[1024]; DatagramPacket dp = new DatagramPacket(buf, buf.length); //接收 socket.receive(dp); //解析出数据包中的内容并打印出来 String text = new String(dp.getData(), 0, dp.getLength()); int port = dp.getPort(); String ip = dp.getAddress().getHostAddress(); System.out.println(ip + ":" + port + "说:" + text); //关闭socket服务 socket.close(); }}
java中使用udp进行数据发送,用到的api主要是java.net包下的,代码示例如下:
服务端代码:
import java.io.InputStream;import java.net.ServerSocket;import java.net.Socket;public class TCPServerDemo { /* * TCP传输创建服务端: * 1、创建TCP服务端socket服务。使用ServerSocket对象 * 2、服务端必须对外提供一个端口,否则客户端无法连接 * 3、获取链接过来的客户端对象 * 4、通过客户端对象获取socket流读取客户端发来的数据,并打印出来 * 5、关闭资源(关闭客户端,关闭服务端) */ public static void main(String[] args) throws Exception { //创建服务端socket对象 ServerSocket serverSocket = new ServerSocket(10000); //得到连进来的客户端的对象 Socket socket = serverSocket.accept(); //获取该客户端对象的输入流,读取客户端发来的数据 InputStream in = socket.getInputStream(); byte[] buf = new byte[1024]; int len = in.read(buf); String text = new String(buf, 0, len); System.out.println(socket.getInetAddress().getHostAddress() + "说:" + text); //关闭资源,注意此处要先关闭客户端 socket.close(); serverSocket.close(); }}
客户端代码:
import java.io.IOException;import java.io.OutputStream;import java.net.Inet6Address;import java.net.InetAddress;import java.net.Socket;import java.net.UnknownHostException;public class TCPClientDemo { /* * TCP传输创建客户端: * 1、创建TCP客户端socket服务。使用的是socket对象。建议该对象一创建就明确 目的地。即要连接的主机 * 2、如果连接建立成功,说明数据传输通道已经建立。该通道就是socket流,是底层建立好的 * 。既然是流说明这里既有输入又有输出。想要输入或者输出流对象,可以找socket来获取。可以通过 * getOutputStream()和getInputStream()来获取两个字节流 * 3、使用输出流将数据写出 */ public static void main(String[] args) throws UnknownHostException, IOException { //创建socket对象,封装目的地ip和端口 Socket socket = new Socket(Inet6Address.getByName("fe80::c93c:a4cb:e167:cb7e%14"), 10000); //获取该socket对象的输出流,进行数据写入,注意只能是字节流 OutputStream out = socket.getOutputStream(); out.write("你是**?".getBytes()); //关闭资源 socket.close(); }}