【017】
(1) 数据的传输模式有哪两种?
TCP和UDP传输
(2) TCP和UDP协议的区别是什么?
TCP:一种面向连接(连接导向)的、可靠的、基于字节流的运输层(Transport layer)通信协议 。
UDP:一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务
1、是否面向连接
【1】TCP是面向连接的,即发送数据前需要与目标主机建立连接。
【2】UDP面向无连接的,发送数据前不需要建立连接。
2、是否可靠交付
【1】TCP在传输数据之前,需要三次握手来建立连接,并且通过数据校验、拥塞控制、重传控制、滑动窗口和确认应答等机制来实现可靠交付。数据传输过程中,数据无丢失,无重复,无乱序。
【2】UDP不提供可靠交付,只有通过检验和去丢弃那些不完整的报文,尽最大努力来保证交付的可靠性。
3、工作效率
【1】前面提到TCP传输数据的控制非常多,这也导致了TCP网络开销大,工作效率相对低下,对系统的资源要求也比较高。
【2】UDP传输控制简单,因此工作效率相对高,对系统资源的要求偏低。
4、实时性
【1】TCP传输数据的控制程序较多,大幅度降低了数据传输的实时性。
【2】UDP协议简单,数据实时性较高。
5、安全性
【1】TCP传输机制多,容易被利用,例如DOS、DDOS攻击,因此在安全性上,不如UDP。
【2】UDP没有TCP这么多机制,被利用的机会就会少很多,但UDP不是绝对安全,也会被攻击。
1. TCP协议数据传递细节
(1) TCP通信原理是什么?
服务器创建 ServerSocket,在指定端口监听并处理请求
客户端创建 Socket,向服务器发送请求
(2) 简述TCP通信的步骤?
服务器端: 客户端:创建Socket(String port)对象
1、创建ServerSocket(int port)对象 1、创建Socket对象
2、在Socket上监听客户端的连接请求 2、向服务器发送链接请求
3、阻塞、等待连接的建立 3、向服务器发送服务请求
4、接受并处理请求 4、接收服务结果
5、将处理结果返回给客户端 5、关闭流和Socket对象
6、关闭流和Socket对象
测试代码:
public class TestClient2 {
/**
* 客户端单次通信
*
* @param args
* @throws IOException
* @throws UnknownHostException
*/
public static void main(String[] args) throws UnknownHostException,
IOException {
// (1)创建Socket对象
Socket client = new Socket("127.0.0.1", 9999);
// (2)获取输出流
DataOutputStream dos = new DataOutputStream(client.getOutputStream());
dos.writeUTF("helloworld");
// (3)获取输入流
DataInputStream dis = new DataInputStream(client.getInputStream());
System.out.println(dis.readUTF());
// (4)关闭流
if (dos != null) {
dos.close();
}
if (dis != null) {
dis.close();
}
if (client != null) {
client.close();
}
}
}
public class TestServer2 {
public static void main(String[] args) throws IOException {
System.out.println("-------------服务器端已启动----------------");
// (1)创建ServerSocket对象
ServerSocket server = new ServerSocket(9999);
// (2)监听是否有客户端来请求连接
Socket client = server.accept();
// (3) 获取输入流
DataInputStream dis = new DataInputStream(client.getInputStream());
System.out.println(dis.readUTF());
// (4)获取输出流
// "收到了"
DataOutputStream dos = new DataOutputStream(client.getOutputStream());
dos.writeUTF("收到了");
// (5)关闭流,关闭Socket
if (dos != null) {
dos.close();
}
if (dis != null) {
dis.close();
}
if (client != null) {
client.close();
}
}
}
2. UDP协议数据传递细节
(1) 简述UDP协议的特点?
1、 不需要利用 IO 流实现数据的传输
2、每个数据发送单元被统一封装成数据包的方式,发送方将数据包发送到网络中,数据包在网络中去寻找他的目的地。
3、DatagramSocket:用于发送或接收数据包
4、DatagramPacket:数据包
(2) 请你举例生活中的哪些应用使用到了UDP?
TCP一般用于文件传输,打电话,发送接收邮件(POP IMAP SMTP 对数据准确性要求高,非紧急应用)等
UDP一般用于发短信,即时通信(QQ聊天 对数据准确性和丢包要求比较低,但速度必须快),在线视频网络语音电话(VoIP 语音数据包一般比较小,需要高速发送,偶尔断音或串音也没有问题)等等。
3. InetAddress类_InetSocketAddress类
(1) InetAddress类的作用及常用方法是什么?
封装计算机的 IP 地址,不包含端口号
常用方法:
1、String getHostAddress() 获得 IP 地址
2、String getHostName() 获得主机名
3、tatic InetAddress getByName(String host) 根据主机名获得 IP 地址
(2) InetSocketAddress类的作用及常用方法是什么?
此类用于实现 IP 套接字地址 (IP 地址+端口号),用于socket 通信
常用方法:
1、InetAddress getAddress() 获取 InetAddress 对象
2、int getPort() 获取端口号
3、String getHostName() 获取主机名
4. URL类_爬虫原理
(1) URL指的是什么?作用是什么?
URL即统一资源定位符,由 4 部分组成:协议 、存放资源的主机域名、端口号和资源文件名。
作用:URL 是指向互联网“资源”的指针,资源可以是简单的文件或目录,也可以是对更为复杂的对象的引用,例如对数据库或搜索引擎的查询。
(2) URL的常用方法有哪些?
1、String getProtocal() 获取此 URL 的协议名称
2、String getHost() 获取此 URL 的主机名(如果适用)
3、int getPort() 获取 URL 的端口号
4、String getFile() 获取此 URL 的文件名
5、getDefaultPort() 获取与此 URL 关联协议的默认端口号
6、getPath() 获取此 URL 的路径部分
5. 基于TCP协议的Socket编程_双向通信_实现单次请求与响应
(1) 请你画出Soket编程实现一次双向通信的传输示意图?
6. 基于TCP协议的Socket编程_双向通信_实现模拟用户登录
(1) 请你画出双向通信用户登录的示意图?
7. 基于TCP协议的Socket编程_聊天室_客户端多线程
(1) 简述客户端与服务器端单次聊天的缺点?
单次聊天的缺点:只能客户端先发送数据,然后才能接收数据,如果不发就收不到,(接收和发送是在一个线程中实现的)不符合实际情况
(2) 单次聊天的缺点的解决方案是什么?
解决方案:(1)多次聊天可以使用循环来解决
(2)先发后收的问题可以使用线程来解决,一个接收数据的线程,一个发送数据的线程
9. UDP通信_DatagramSocket实现_客户咨询
(1) 简述UDP通信的原理?
应用层报文传输到运输层,使用UDP的话会加上UDP首部,到了IP层会加上IP首部。
UDP数据包包含(8字节UDP报文头、我们要发送的实际数据)
UDP报头包含(源端口、目的端口、数据包长度、校验) 每个部分都是2个字节。
IP数据报包含(20个字节的IP数据报头 、UDP数据包)
数据帧包含(帧头、IP数据包、帧尾)
UDP对应用层交下来的东西,既不合并,也不拆分,而是保留这些报文的边界。应用层交给UDP多长的报文,UDP就照样发送,即一次发送一个报文。在接受方的UDP,对IP层交上来的UDP用户数据报,在去除首部后就原封不动的交付给上层的应用进程。