了解一下!主要利用java实现下传输层
文章目录
一、网络通信协议
网络通讯协议:同一个网络下计算机之间需要遵守的规则。
只有对数据的传输格式、传输效率、传输步骤等进行了统一规定,通信双方才能完成数据交换。
网络通信协议有很多种(类比这个世界上不同的语言),目前应用最广泛的是TCP/IP协议
(类比英语?)
1.1 TCP/IP协议的层次结构
- 应用层: HTTP、FTP、DNS域名服务器
- 传输层: TCP、UDP
- 网络层: IP、ICMP、IGMP
- 链路层: 驱动程序、接口
- 应用层: 主要负责应用程序的协议
- 传输层: 主要使网络程序进行通信
- 网络层: 是整个TCP/IP协议的核心,主要将传输的数据进行分组,发送到目标计算机或者网络
- 链路层: 用于定义物理传输通道,通常是对某些网络连接设备的驱动协议。
1.2 IP地址和端口号
要使网络中的计算机能够通信,那么需要给电脑一个标识在TCP/IP协议中这个标识就是IP地址
IPv4:4字节二进制 方便记忆 ,常写成4个十进制数字(0-255)用.隔开。
例:198.163.0.1
IPv6:16字节二进制 因为地址不够用了
通过IP地址可以连接到指定计算机,但如果想访问目标计算机中的某个应用程序,还需要指定端口号。
在计算机中,不同程序是通过端口号区分的
端口号是由两个字节二进制表示的,取值是0~65535
其中0~1023之间的端口号用于一些知名的网络服务和应用,用户的普通程序需要使用1024以上的端口号,从而避免端口号被占用。
1.3 Java : InetAddress类
修饰符 返回值 | 方法名(参数类型) | 描述 |
---|---|---|
static InetAddress | getByName(String host) | 在给定主机名的情况下确定主机的IP地址 |
static InetAddress | getLocalHost() | 返回本地主机 |
String | getHostName() | 获取此IP地址的主机名 |
String | getHostAddress() | 返回IP地址字符串(以文本表现形式) |
import java.net.InetAddress;
import java.net.UnknownHostException;
//代码展示上面的四种方法
public class InetA {
public static void main(String[] args) throws UnknownHostException {
InetAddress localHost = InetAddress.getLocalHost();
System.out.println(localHost);
String hostName = localHost.getHostName();
System.out.println(hostName);
String hostAddress = localHost.getHostAddress();
System.out.println(hostAddress);
InetAddress byName = InetAddress.getByName(InetAddress.getLocalHost().getHostName());
System.out.println(byName);
}
}
二、UDP与TCP协议
2.1 UDP协议
UDP是无连接通信协议,数据的发送端和接收端不建立逻辑链接。
优点:消耗资源小,通信效率高 | 缺点:不保证数据的完整性,也不安全
通常UPD协议用来传输音频、视频和普通数据,即使丢一两个数据包问题也不大。
2.2 TCP协议
TCP是面向连接通信协议,数据的发送端和接收端先建立逻辑链接,然后再传输数据。
TCP协议必须要有服务端和客户端
三次握手
- 客户端向服务端发送连接请求
- 服务器响应客户端的连接请求
- 客户端发送确认信息建立连接
TCP协议可以保证数据的完整性与安全性,下载文件使用TCP协议。
三、Java实现数据传输
3.1 DatagramPacket类
对需要传输的数据进行“装箱”处理(方便搬运工搬东西嗷
构造方法
//构造方法,用来 接收接收接收 长度为length的数据包 / DatagramPacket(byte[] buf, int length) DatagramPacket dp = new DatagramPacket(data, data.length); //构造方法,用来 发送发送发送 长度为length的数据包到 指定指定指定 主机上的 制定指定指定 端口号 /DatagramPacket(byte[] buf, int length, InetAddress address, int port) DatagramPacket dp = new DatagramPacket(data, data.length, InetAddress.getLocalHost(), 666);
常用方法
返回值 | 方法名(参数) | 描述 |
---|---|---|
InetAddress | getAddress() | 返回某台机器的IP地址,可能是发往该机器或者从该机器接收到的。 |
int | getPort() | 返回某台远程主机的端口号可能是发往该机器或者从该机器接收到的。 |
byte[] | getData() | 返回数据缓存区(拆箱子 |
int | getLength() | 返回将要发送或接收到的数据的长度(称重量,看看里面装了多少东西 |
3.2 DatagramSocket类
嘿嘿嘿,搬运工来咯!
构造方法
//无参构造,发送用哪个端口不重要,可以不指定端口 /DatagramSocket() DatagramSocket ds = new DatagramSocket(); //有参构造,指定端口,接收时必须指定监视哪个端口。要是随机一个,就得都监听。 /DatagramSocket(int port) DatagramSocket ds = new DatagramSocket(666);
常用方法
返回值 | 方法名(参数) | 描述 |
---|---|---|
void | receive(DatagramPacket p) | 接收这个“集装箱” |
void | send(DatagramPacket p) | 发送这个“集装箱” |
四、一个简单的案例(实现UDP
先运行接收,再运行发送
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
//实现发送
public class Send {
public static void main(String[] args) throws Exception {
//数据进箱子,写地址
byte[] data = "我是黑客,我在入侵你的电脑".getBytes();
DatagramPacket dp = new DatagramPacket(data, data.length, InetAddress.getLocalHost(), 666);
//创建大货车
DatagramSocket ds = new DatagramSocket();
//发送数据
ds.send(dp);
}
}
import java.net.DatagramPacket;
import java.net.DatagramSocket;
//实现接收
public class Receive {
public static void main(String[] args) throws Exception{
//创建接受的箱子
byte[] data = new byte[1024];
DatagramPacket dp = new DatagramPacket(data, data.length);
//创建车的端口
DatagramSocket ds = new DatagramSocket(666);
//接受数据,数据装到接受箱子dp里
ds.receive(dp);
//从箱子拿数据,箱子大,拿多少?
int length = dp.getLength();
byte[] receiveData = dp.getData();
System.out.println(new String(receiveData,0,length));
}
}
可能遇见的问题:找不到这样的主机
据说是因为: 1.主机名称没有绑定IP地址 | 2.开启了防火墙
网络编程上篇儿就结束了!下篇儿再写几个难一点儿的例子,讲一点儿知识点就OK了!
再插一嘴,多点赞收藏嗷,评论也是可以的,但是我社恐,嘻嘻嘻