1、Socket是对TCP/IP协议的封装,Socket本身并不是协议,而是一个调用接口(API),通过Socket,我们才能使用TCP/IP协议,TCP连接默认是用长连接的。
TCP和UDP是OSI模型中的运输层中的协议。TCP提供可靠的通信传输,而UDP则常被用于让广播和细节控制交给应用的通信传输。
2、TCP与UDP如何加以区分使用?
TCP用于在传输层有必要实现可靠性传输的情况。由于它是面向有连接并具备顺序控制、重发控制等机制的。所以它可以为应用提供可靠传输。
另一方面,UDP主要用于那些对高速传输和实时性有较高要求的通信或广播通信。举一个IP电话进行通话的例子。如果使用TCP,数据在传送途中如果丢失会被重发,但是这样无法流畅地传输通话人的声音,会导致无法进行正常交流。而采用UDP,它不会进行重发处理。从而也就不会有声音大幅度延迟到达的问题。即使有部分数据丢失,也只是影响某一小部分的通话。此外,在多播与广播通信中也使用UDP而不是TCP。RIP、DHCP等基于广播的协议也要依赖于UDP。
二 、TCP和UDP的区别?
- TCP面向连接;UDP是无连接的,即发送数据之前不需要建立连接。通俗理解:TCP就是打电话,对方必须应答,才能连接,UDP就是写信,只管信寄出去,不管对方收到与否;
- TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保证可靠交付;
- TCP面向字节流,实际上是TCP把数据看成一连串无结构的字节流;UDP是面向报文的;
- UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如IP电话,实时视频会议等)
- 每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信;
- TCP首部开销20字节;UDP的首部开销小,只有8个字节
- TCP的逻辑通信信道是全双工的可靠信道,UDP则是不可靠信道。
三 、两者的程序设计框架
- TCP
:
2.UDP:
- TCP、UDP优缺点
TCP优点:
- TCP提供以认可的方式显式地创建和终止连接。
- TCP保证可靠的、顺序的(数据包以发送的顺序接收)以及不会重复的数据传输。
- TCP处理流控制。
- 允许数据优先
- 如果数据没有传送到,则TCP套接口返回一个出错状态条件。
- TCP通过保持连续并将数据块分成更小的分片来处理大数据块。—无需程序员知道
缺点:TCP在转移数据时必须创建(并保持)一个连接。这个连接给通信进程增加了开销,让它比UDP速度要慢。
UDP优点:
- UDP不要求保持一个连接
- UDP没有因接收方认可收到数据包(或者当数据包没有正确抵达而自动重传)而带来的开销。
- 设计UDP的目的是用于短应用和控制消息
- 在一个数据包连接一个数据包的基础上,UDP要求的网络带宽比TCP更小。
Java网络编程之(一): TCP的简单连接
这是一组非常基本的连接,
局域网中电脑A用作服务端,IP为192.168,31.168
电脑B用作客户端,IP为192.168.31.132
package cn.com.tcp;
import java.io.IOException;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
/**
* 服务器端
* 编写者:zrf
* 创建时间:2019年9月25日
* cn.com.tcp
*TcpServer_1.java
*/
public class TcpServer_1 {
public static void main(String[] args) throws IOException {
//创建一个ServerSocket, 用于监听客户端Socket的连接请求
ServerSocket soket = new ServerSocket(30000);
//用循环不断接收来自客户端的请求
while(true){
//每当接收到一个客户端的请求,服务器也对应产生一个Socket
Socket ss = soket.accept();
//将Socket对应的输出流包装成printStream
PrintStream ps = new PrintStream(ss.getOutputStream());
ps.print("你的消息来自于服务器端!");
//关闭输出流,关闭socket
ps.close();
ss.close();
}
客户端:
package cn.com.tcp;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
import java.net.UnknownHostException;
/**
* 客户端
* 编写者:zrf
* 创建时间:2019年9月25日
* cn.com.tcp
*TcpClient_1.java
*/
public class TcpClient_1 {
public static void main(String[] args) throws UnknownHostException, IOException {
Socket socket = new Socket("192.168.1.101", 30000);
//将Socket对应的输入流包装成BufferedReader
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String line = br.readLine();
System.out.println("来自服务器端的消息01: " + line);
//关闭输入流,关闭Socket;
br.close();
socket.close();
}
}