我在《JavaSE項目之聊天室swing版》中通過遵守TCP協議的ServerSocket與Socket實現了聊天室的群聊窗口。同時,在介紹OSI與TCP/IP參考模型時,也曾提及TCP與UDP(全稱User Datagram Protocol,用戶數據報協議)。
總的來說,TCP與UDP的區別有:
1.TCP與UDP的基本區別:
(1)TCP基於連接,UDP基於無連接;
(2)TCP要求系統資源較多,UDP則較少;
(3)UDP程序結構較簡單;
(4)流模式(TCP)與數據報模式(UDP);
(5)TCP保證數據正確性,UDP可能丟包;
(6)TCP保證數據順序,UDP不保證。
2.UDP應用場景主要有:
(1)面向數據報方式;
(2)網絡數據大多為短消息;
(3)擁有大量Client;
(4)對數據安全性無特殊要求;
(5)網絡負擔非常重,但對響應速度要求高。
3.具體編程時的區別:
(1)套接字Socket的參數不同;
(2)UDP不需要調用listen和accept;
(3)UDP收發數據分別用send()和receive()方法;
(4)TCP:地址信息在connect和accept時確定;
(5)UDP:在send()和receive()方法中每次均需指定地址信息。
我接下來通過代碼演示UDP協議。我寫了兩個類,分別是UDPA和UDPB,通過UDPA給UDPB發送信息。
UDPA.java中的代碼如下:
package com.itszt.test;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
/**
* UDPA要給UDPB發信息
*/
public class UDPA {
public static void main(String[] args) throws IOException {
byte[] bs = "我是A,給B發信息".getBytes();//要發的信息內容
//UDPA與UDPB的ip均為本機ip,故設置不同的端口號
InetAddress desIp = InetAddress.getLocalHost();
//數據報包,UDPB的端口為10010
DatagramPacket p = new DatagramPacket(bs, bs.length, desIp, 10010);
//創建數據報套接字,UDPA的端口設置為10086
DatagramSocket socket_A = new DatagramSocket(10086);
//UDPA給UDPB發送數據報
socket_A.send(p);
//關閉socket_A套接字
socket_A.close();
}
}
UDPB.java中的代碼如下:
package com.itszt.test;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
/**
* UDPB接收來自UDPA的信息
*/
public class UDPB {
public static void main(String[] args) throws IOException {
//用數組接收數據報包
byte[] bs = new byte[500];
DatagramPacket p = new DatagramPacket(bs, bs.length);
//創建數據報套接字
DatagramSocket socket_B = new DatagramSocket(10010);
//接收數據報包
socket_B.receive(p);
System.out.println(new String(bs, 0, p.getLength()));
//關閉套接字
socket_B.close();
}
}
在程序運行時,先運行UDPB,等着接收UDPA發來的信息,然后再運行UDPA,則UDPB接收到UDPA的信息如下:
我是A,給B發信息
