认识网络
-
计算机网络:是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统。
-
网络模型
- OSI分层(7层):物理成,数据链路层,网络层,传输层,会话层,表示层,应用层
- TCP/IP分组:网络接口层,网际层,运输层,应用层
- 五层协议:物理层,数据链路层,传输层,网络层,应用层
-
各层的功能
- 物理层:通过媒介传输比特流
- 数据链路层:将比特流封装成帧和点对点的传输
- 网络层:数据包的传输和网际互连
- 传输层:提供端到端的可靠报文传输和差错控制
- 会话层,建立,管理和终止会话
- 表示层:对数据进行翻译,加密和压缩
- 应用层:允许访问OSI环境的手段
-
各层上使用的协议
- 物理层:RJ45,CLOCK
- 数据链路层:PPP,FR,VLAN,MAC
- 网络层:IP,ICMP,IBMP,ARP,RARP,OSPF
- 传输层:TCP,UDP
- 会话层:NFS,SQL
- 表示层:JPEG
- 应用层:FTP,DNS,SMTP,HTTP,WWW.NFS
网络编程三要素
-
IP
所谓IP地址就是给每个连接在Internet上的主机分配的一个32bit地址,
IP地址=网络号+主机号
A类IP地址:第一段号码为网络地址,剩下的三段号码为本地计算机的号码
B类IP地址:前二段号码为网络地址,剩下的二段号码为本地计算机的号码
C类IP地址:前三段号码为网络地址,剩下的一段号码为本地计算机的号码
特殊地址
127.0.0.1 回环地址,可用于测试本机的网络是否有问题. ping 127.0.0.1
DOS命令 ipconfig:查看本机IP地址
xxx.xxx.xxx.255 广播地址 -
端口
物理端口 网卡口
逻辑端口 我们指的就是逻辑端口
a:每个网络程序都会有一个逻辑端口
b:用于标识进程的逻辑地址,不同进程的标识
c:有效端口:065535(两个字节),其中01023系统使用或保留端口。 -
协议
TCP:特点-
面向链接,可靠的数据传输
-
传输单位是TCP报文段,传输没有大小限制
-
TCP传输速度慢,更注重数据的安全性
UDP:特点: -
面向非链接,不可靠的传输
-
传输单位是用户数据报,传输有大小限制
-
UDP传输速度快,因为不需要链接等待,少了许多操作
-
InetAddress类
为了方便我们对IP地址的获取和操作,java提供了一个类InetAddress 供我们使用
此类表示互联网协议 (IP) 地址。
InetAddress类的常见功能
public static InetAddress getByName(String host)
public String getHostAddress()//获取IP
public String getHostName()//获取主机名
getLocalHost();返回本地主机
UDP
UDP发送数据步骤:
- a: 创建UDP通讯客户端对象(DatagramSocket)
- b: 创建数据报包 public DatagramPacket(byte[] buf, int length, InetAddress address,int port)
- c: 发送 数据
- d: 释放资源
public class UDPClient {
public static void main(String[] args) throws IOException {
//创建客户端对象
DatagramSocket datagramSocket = new DatagramSocket();
Scanner scanner = new Scanner(System.in);
while (true){
System.out.println("客户端向服务器发送的数据:");
String s = scanner.nextLine();
//要发送的内容存入字节数组
byte[] bytes = s.getBytes();
//要发送给多少端口号的主机
InetAddress localHost = Inet4Address.getLocalHost();
//定义一个数据包
DatagramPacket datagramPacket = new DatagramPacket(bytes,bytes.length,localHost,7777);
//发送数据
datagramSocket.send(datagramPacket);
if ("886".equals(s))
break;
}
//关闭资源
datagramSocket.close();
}
}
UDP接收数据步骤:
- a: 创建UDP通讯协议服务器端对象(DatagramSocket) 注意要用有参数构造 指定端口号
- b: 创建数据报包,作用用来接收数据 // public DatagramPacket(byte[] buf, int length)
- c: 接收数据 receive(dp) ;
- d: 解析数据报包,拿出数据 dp.getData() ; dp.getLength() ;
- e: 释放资源
public class UDPService {
public static void main(String[] args) throws IOException {
//暴露端口
DatagramSocket datagramSocket = new DatagramSocket(7777);
System.out.println("服务器开启,等待客户端的数据:");
//创建一个空的数据报包
while (true){
byte[] bytes=new byte[1024];
DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length);
//接收
datagramSocket.receive(datagramPacket);
//从数据包取数据
byte[] data = datagramPacket.getData();
int length = datagramPacket.getLength();
String string = new String(data, 0, length);
System.out.println(string);
if ("886".equals(string))
break;
}
datagramSocket.close();
}
}
TCP
TCP发送数据步骤:
- a: 创建TCP通讯协议客户端对象(Socket) // public Socket(String host, int port)
- b: 获取输出流对象
- c: 写数据
- d: 释放资源
Socket socket = new Socket("192.168.11.123", 8888);
//发送数据
//获取通道中的流
OutputStream out = socket.getOutputStream();
out.write("你好TCP服务端,我来了".getBytes());
//释放资源
socket.close();
TCP接收数据步骤
- a: 创建TCP通讯协议服务器端对象(ServerSocket)
- b: 监听客户端
- c: 获取输入流对象
- d: 读取数据
- e: 释放资源
ServerSocket ss = new ServerSocket(8888);//暴露端口号
//侦听 客户端的连接
System.out.println("服务器已经开启,等待连接...");
//一旦有客户端连接上来,就返回该套接字
//侦听并接受到此套接字的连接。此方法在连接传入之前一直阻塞。
Socket sk = ss.accept();//阻塞式方法,会阻塞在这里,等待客户端的连接
InputStream in = sk.getInputStream();
byte[] bytes = new byte[1024];
int len = in.read(bytes);
String s = new String(bytes, 0, len);
System.out.println(s);
//释放资源
ss.close();