1.什么是UDP?
UDP是用户数据报协议,它是面向无连接的通信协议,什么叫无连接?它不需要客户端和服务端建立连接,简单来讲,我发送一个图片给你,不需要你来连接我,我自己指定端口号和IP地址发送给你,我发送完后我就不管了,你数据丢了或者说图片不清晰都不关我的事,我已经发了这个请求给你了,剩下的与我无关。
2.什么是TCP?
TCP是传输控制协议,面向有连接的协议,当客户端与服务端连接成功后,才可以开始传输数据,而且TCP传输数据是完整的,但是效率不高。
3.TCP和UDP的各自特点
UDP:面向无连接的,传输效率高,但是传输数据不完整,很容易丢包,适用于实时性较强的场景,例如直播,语音聊天等等。
TCP:面向有连接的,传输效率低(每次连接都需要三次握手,每次断开连接都需要四次挥手),传输数据完整,不会丢失数据,适用于实时性不高的场景,例如文件上传,图片上传等等。
4.java实现UDP小案例
案例1:客服端发送数据,服务端响应数据
public class Test14_UDP客户端 {
public static void main(String[] args) throws Exception{
//创建一个UDP报文
DatagramSocket socket=new DatagramSocket();
//封装一个UDP报文
byte [] data=new byte[8192];
DatagramPacket packet=new DatagramPacket(data,data.length, InetAddress.getByName("localhost"),8080);
// 设置UDP报文的数据
packet.setData("你好".getBytes());
packet.setLength("你好".getBytes().length);
socket.send(packet);
}
}
public class Test15_UDP服务端 {
public static void main(String[] args) throws Exception {
DatagramSocket socket=new DatagramSocket(8080);
byte [] data=new byte[8192];
DatagramPacket packet=new DatagramPacket(data,data.length);
socket.receive(packet);
socket.close();
System.out.println("接收到了数据:"+new String(data,0,packet.getLength()));
}
}
接收到了数据:你好
5.java实现TCP小案例
案例1:多线程实现建立客户端和服务端,来回聊天
public class Test16_TCP多线程聊天1 {
private static Socket socket;
public static void main(String[] args) throws IOException {
Scanner sc = new Scanner(System.in);
socket=socket =new Socket("localhost",8080);
//写数据
new Thread(() -> {
try {
OutputStream os = socket.getOutputStream();
while (true){
String s = sc.nextLine();
os.write(s.getBytes());
}
} catch (IOException e) {
e.printStackTrace();
}
}).start();
//读数据
new Thread(() -> {
try {
int len;
byte[] bytes = new byte[8192];
InputStream is = socket.getInputStream();
while (true){
while ((len = is.read(bytes)) != -1) {
System.out.println("收到回复是:"+new String(bytes,0,len));
}
}
} catch (IOException e) {
e.printStackTrace();
}
}).start();
}
}
public class Test17_TCP多线程聊天2 {
public static void main(String[] args) throws IOException {
Scanner sc = new Scanner(System.in);
ServerSocket serverSocket=new ServerSocket(8080);
Socket socket = serverSocket.accept();
//写数据
new Thread(() -> {
try {
OutputStream os = socket.getOutputStream();
while (true){
String s = sc.nextLine();
os.write(s.getBytes());
}
} catch (IOException e) {
e.printStackTrace();
}
}).start();
//读数据
new Thread(() -> {
try {
int len;
byte[] bytes = new byte[8192];
InputStream is = socket.getInputStream();
while (true){
while ((len = is.read(bytes)) != -1) {
System.out.println("收到回复是:"+new String(bytes,0,len));
}
}
} catch (IOException e) {
e.printStackTrace();
}
}).start();
}
}
案例2:复制图片,客户端连接成功后,服务端返回一张图片,客户端接收并存入磁盘
public class Test12_文件下载服务端 {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket=new ServerSocket(8080);
Socket socket = serverSocket.accept();
OutputStream os = socket.getOutputStream();
FileInputStream fis=new FileInputStream("F:/2.webp");
int len;
byte [] bytes=new byte[8192];
while ((len=fis.read(bytes))!=-1){
os.write(bytes,0,len);
}
}
}
public class Test11_文件下载客户端 {
public static void main(String[] args) throws IOException {
Socket socket=new Socket("localhost",8080);
InputStream is = socket.getInputStream();
FileOutputStream fos=new FileOutputStream("F:/copy.webp");
int len;
byte[] bytes=new byte[8192];
while ((len=is.read(bytes))!=-1){
fos.write(bytes,0,len);
}
System.out.println("文件下载成功");
fos.close();
}
}