
1、物理层:主要定义物理设备标准,如网线的接口类型、光纤的接口类型、各种传输介质的传输速率等。它的主要作用是传输比特流(就是由0、1转化为电流强弱来进行传输,到达目的地后再转化为0、1,也就是我们常说的数模转换与模数转换)。这一层的数据叫做比特。
2、数据链路层:主要将从物理层接受的数据进行MAC地址(网卡的地址)的封装与解封装。常把这一层的数据叫做帧。在这一层工作的设备是交换机,数据通过交换机来传输。
3、网络层:主要讲从下层接受到的数据进行IP地址(列:192.168.0.1)的封装与解封装。在这一层工作的设备是路由器。常把这一层的数据叫做数据包。
4、传输层:定义一些传输数据的协议和端口号(WWW端口80等),如:TCP(传输控制协议,传输效率低,可靠性强,用于传输可靠性要求高、数据量大的数据),UDP(用户数据报协议,与TCP特性恰恰相反,用于传输可靠性要求不高,数据量小的数据,如QQ聊天数据就是通过这种方式传输的)。主要是将从下层接受的数据进行分段和传输,到达目的地址后再进行重组。常把这一层叫做段。
5、会话层:通过传输层(端口号:传输端口号与接受端口号)建立数据传输的通路。主要在你的系统之间发起会话或者接受会话请求(设备之间需要互相认识,可以是IP也可以是MAC或者是主机名)
6、表示层:主要是进行对接受的数据进行解释、加密与解密、压缩与解压缩(也就是把计算机能够识别的东西转换成人能够识别的东西)
7、应用层:主要是一些终端的应用,比如FTP(各种文件下载)、WEB(IE浏览)、QQ之类的(可以把它理解成我们在电脑屏幕上可以看到的东西,就是终端应用)
网络中设备的标识
不易记忆,可用主机名
本地回环地址:127.0.0.1 主机名:localhost
用于标识进程的逻辑地址,不同进程的标识。
有效端口:0-65535,其中0-1024系统使用或保留端口。
通讯的规则
常见协议:TCP、UDP
UDP(类似对讲机) 将数据及源和目的封装成数据包中,不需要建立连接 每个数据报的大小限制在64k内 因无连接,是不可靠协议 不需要建立连接,速度快
TCP(类似电话) 建立连接,形成传输数据的通道 在连接中进行大数据量传输 通过三次握手完成连接,是可靠协议 必须建立连接,效率会稍低
Socket 就是为网络服务提供的一种机制,通信的两端都有 socket,网络通信其实就是 socket 通信,数据在两个 socket 间通过 IO 传输
DatagramSocket(此类表示用来发送和接收数据包的套接字)和 DatagramPacket(此类表示数据报包)
建立发送端和接收端
建立数据包
调用 Socket 的发送接收方法
关闭 Socket
发送端和接收端是两个独立的运行程序
示例
import java.net.InetAdress;
import java.net.DatagramSocket;
import java.net.DatagramPacket;
import java.net.SocketException;
import java.net.UnknowHostException;
public class UDPSendDemo{
public static void main(String[] args) throws SocketException,UnknowHostException{
//创建UDP传输的发送端
//1、建立udp的socket服务
DatagramSocket ds = new DatagramSocket();
//2、将要发送的数据封装到数据包中
String str = "udp数据传输演示";
byte[] buf = str.getBytes();
DatagramPacket dp = new DatagramPacket(buf,buf.length,InetAdress.getByName("192.168.1.100"),10000);
//3、通过udp的socket服务将数据包发送出去
ds.send(dp);
//4、关闭socket服务
ds.close();
}
}
import java.net.InetAdress;
import java.net.DatagramSocket;
import java.net.DatagramPacket;
import java.net.SocketException;
import java.net.UnknowHostException;
public class UDPReceDemo{
public static void main(String[] args) throws SocketException,UnknowHostException{
//创建UDP传输的接收端
//1、建立udp的socket服务,因为是要接受数据,所以必须要明确一个端口号。
DatagramSocket ds = new DatagramSocket(10000);
//2、创建数据包,用于存储接收到的数据。方便用数据包对象的方法解析这些数据。
byte[] buf = new byte[1024];//提前知道数据有多大了,不写循环了
DatagramPacket dp = new DatagramPacket();
//3、使用socket服务的receive方法将数据存储到数据包中。
ds.receive(dp);//阻塞式的
//4、通过数据包的方法解析数据包中的数据(比如,地址、端口、数据内容)
String ip = dp.getAdress().getHostAdress();
int port = dp.getPort();
String text = new String(dp.getData(),o.dp.getLength());
System.out.println(ip+":"+port+":"+text);
//5、关闭资源
ds.close();
}
}
Socket(此类实现客户端套接字)和 ServerSocket(此类实现服务器套接字)
建立客户端和服务端
建立连接后,通过 Socket 中的 io 流进行数据的传输
关闭 socket
同样,客户端与服务器端是两个独立的应用程序。
示例
import java.IOException;;
import java.net.UnknowHostException;
public class ClientDemo{
public static void main(String[] args) throws IOException,UnknowHostException{
//TCP传输,客户端建立过程
//1、创建tcp客户端socket服务,使用的是Socket对象。
//建议该对象一创建就明确目的地。要连接的主机。
Socket socket = new Socket("192.168.109.100",10000);
//2、如果连接建立成功,说明数据传输通道已建立。
//该通道就是socket流,是底层建立好的。既然是流,说明这里既有输入又有输出。
//要想输入或者输出流对象,可以找Socket来获取(getOutputStream/getInputStream)。
OutputStream out = socket.getOutputStream();
//3、使用输出流,将数据写出。
out.write("TCP演示".getBytes());
//4、关闭资源
socket.close();
}
}
public class ServerDemo{
public static void main(String[] args){
//TCP传输,服务端建立过程
//1、创建tcp服务端socket服务,使用的是ServerSocket对象。
ServerSocket ss = new ServerSocket(10000);
//2、服务端必须对外提供一个端口,否则客户端无法连接
//3、获取连接过来的客户端对象
Socket s = ss.accept();//阻塞式
String ip = s.getInetAdress().getHostAdress();
//4、通过客户端对象,获取socket流读取客户端发来的数据
InputStream in = s.getInputStream();
//读取数据
byte[] buf = new byte[1024];
int len = in.read(buf);
String text = new String(buf,0,len);
System.out.println(ip+":"+text);
//5、关闭资源。(关客户端、关服务端)
s.close();
ss.close();
}
}
public class ClientDemo{
public static void main(String[] args) throws IOException,UnknowHostException{
Socket socket = new Socket("192.168.109.100",10000);
OutputStream out = socket.getOutputStream();
out.write("TCP演示".getBytes());
//读取服务端返回的数据,使用socket读取流
InptuStream in = socket.getInputStream();
byte[] buf = new byte[1024];
int len in.read(buf);
String text = new String(buf,0,len);
System.out.println(text);
socket.close();
}
}
public class ServerDemo{
public static void main(String[] args){
ServerSocket ss = new ServerSocket(10000);
Socket s = ss.accept();//阻塞式
String ip = s.getInetAdress().getHostAdress();
InputStream in = s.getInputStream();
byte[] buf = new byte[1024];
int len = in.read(buf);
String text = new String(buf,0,len);
System.out.println(ip+":"+text);
//使用客户端socket对象输出流,给客户端返回数据
OutputStream = s.getOutputStream();
out.write("收到".getBytes());
s.close();
ss.close();
}
}
