TCP
为了方便开发网络应用程序,美国伯克利大学在Unix上实现的一种应用程序访问网络的通信协议Socket,Socket的出现使程序员可以很方便的访问TCP/IP;
使用TCP/IP的套接字(Socket)进行通信:
- 服务器程序将一个套接字绑定到一个特定的端口,并通过此套接字等待和监听客户端到端口的连接请求;
- 客户端程序根据服务器程序所在的主机名和端口发出连接请求。
以客户端向服务器端发送 11.jpg(下图) 为例:
客户端:
import java.io.FileInputStream;
import java.io.OutputStream;
import java.net.Socket;
public class Client {
public static void main(String[] args) {
try {
//建立链接:指定server所在主机地址和对应的端口(绑定过程)
Socket socket = new Socket("127.0.0.1", 9999);
//使用IO技术将图片发送
OutputStream outputStream = socket.getOutputStream();
FileInputStream fileInputStream = new FileInputStream("D:\\11.jpg");
byte [] car = new byte[1024];
int length = 0;
while((length = fileInputStream.read(car))!=-1) {
outputStream.write(car, 0, length);
}
outputStream.flush();
outputStream.close();
fileInputStream.close();
//传输结束,关闭链接
socket.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
服务器端:
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
public static void main(String[] args) {
try {
//建立服务器接口(绑定过程)
ServerSocket serverSocket = new ServerSocket(9999);
//等待接收来自客户端(client)信息
Socket socket = serverSocket.accept();
//对接收到的图片进行处理在本地生成
InputStream inputStream = socket.getInputStream();
byte [] car = new byte[1024];
int length = 0;
FileOutputStream fileOutputStream = new FileOutputStream("D:\\22.jpg");
while((length=inputStream.read(car))!=-1) {
fileOutputStream.write(car, 0, length);
}
fileOutputStream.flush();
fileOutputStream.close();
inputStream.close();
//操作结束,关闭链接
serverSocket.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
我们可以看出,TCP 链接传输是需要在客户端和服务器端之间先建立链接,再传输数据;正因为如此,该方法传输数据准确率高,基本不会出现丢数据的情况,主要用来进行精准的数据传输;、
UDP
-
UDP是用户数据报协议,基于UDP的Socket编程是一种非连接的Socket通信,它提供的是无连接、不可靠信息传送服务。
-
DatagramSocket:用来发送和接收数据包的套接字
-
DatagramPacket :表示数据包
步骤:
- 创建数据Socket,指定一个服务端端口号。
- 提供一个byte数组用于数据存储。
- 调用DatagramPacket的receive() 方法进行数据的接收;
- 调用DatagramPacket的getData()方法得到byte数组的数据;
- 释放资源。
客户端:
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
public class Client {
public static void main(String[] args) {
try {
//新建套接字绑定端口
DatagramSocket socket = new DatagramSocket(9999);
//创建 包packet 存储需要的数据
byte [] data = "来自客户端的问候".getBytes();
InetSocketAddress address = new InetSocketAddress("127.0.0.1",8888);
DatagramPacket packet = new DatagramPacket(data, data.length, address);
//发送 packet包
socket.send(packet);
socket.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
服务器端
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class Server {
public static void main(String[] args) {
try {
//新建套接字绑定端口
DatagramSocket socket = new DatagramSocket(8888);
//创建需要的 packet包 准备接收数据
byte [] car = new byte[1024];
DatagramPacket packet = new DatagramPacket(car, car.length);
//接收数据
socket.receive(packet);
int length = packet.getLength();
System.out.println(new String(car, 0, length));
//关闭
socket.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
Server 控制台输出结果:
我们发现使用 UDP 传输数据是不需要先建立链接的,因为目标主机和端口号会被存储在 packet包 中,socket 只会发送 packet包,根据 packet包 中的信息寻找客户端;因此,UDP 是可以一对多进行数据传输的,只需要将发给不同的主机或端口号存储在不同的 packet包 中发送即可。
注意:UDP 因为没有首先建立链接,因此 UDP 有一定的数据丢失率(其实并不高),但因为传输速度比 TCP 快,常用来传输一些图片、视频等即使丢了一点数据也不会影响使用的数据。
小结:TCP与UDP区别
- TCP面向连接,发送数据前要先建立连接;UDP是无连接的,发送数据前不需要建立连接;
- TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,不保证可靠交付;
- UDP有较好的实时性,效率比TCP高,适用于对高速传输和实时性较高的通信或广播通信;
- 每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信。
来源:CSDN
作者:梦忆长安
链接:https://blog.csdn.net/qq_44971038/article/details/104692964