UDP和TCP通信機制
UDP
將數據源和目的封裝成數據包中,不需要建立連接;每個數據報的大小在限制在64k;因無連接,是不可靠協議;不需要建立連接,速度快。
UDP協議發送和接收數據圖解
接收端的代碼:
package UDP數據接收與發送;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
/*
* UDP協議接收數據:
* A:創建接收端Socket對象
* B:創建一個數據包(接收容器)
* C:調用Socket對象的接收方法接收數據
* D:解析數據包,並顯示在控制檯
* E:釋放資源
*/
public class ReceiveDemo {
public static void main(String[] args) throws IOException {
// 創建接收端Socket對象
DatagramSocket ds = new DatagramSocket(10086);
// 創建一個數據包(接收容器)
byte[] bys = new byte[1024];
int length = bys.length;
DatagramPacket dp = new DatagramPacket(bys, length);
// 調用Socket對象的接收方法接收數據
ds.receive(dp);// 阻塞方法
// 解析數據包,並顯示在控制檯
InetAddress ia = dp.getAddress();
String ip = ia.getHostAddress();
byte[] bys2 = dp.getData();
int len = dp.getLength();
String s = new String(bys2, 0, len);
System.out.println(ip + "發來數據:" + s);
// 釋放資源
ds.close();
}
}
發送端的代碼:
package UDP數據接收與發送;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
/*
* UDP協議接收數據:
* A:創建發送端Socket對象
* B:創建一個數據包(發送容器)
* C:調用Socket對象的發送方法接收數據
* E:釋放資源
*/
public class SendDemo {
public static void main(String[] args) throws IOException {
// 創建發送端Socket對象
DatagramSocket ds = new DatagramSocket();
// 創建一個數據包(發送容器)
byte[] bys = ("hello,DUP,我來了").getBytes();
int length = bys.length;
InetAddress address = InetAddress.getByName("59.71.66.152");
int port = 10086;
DatagramPacket dp = new DatagramPacket(bys, length, address, port);
// 調用Socket對象的發送方法接收數據
ds.send(dp);
// 釋放資源
// ds.close();
}
}
TCP
建立連接,形成傳輸數據的通道;在連接中進行大數據量傳輸;通過三次握手完成連接,是可靠協議;必須建立連接,效率會稍低
TCP協議發送和接收數據圖解
服務器端代碼:
package TCP數據發送與接收;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class ServerDemo {
public static void main(String[] args) throws IOException {
// 創建接收端的套接字對象
ServerSocket ss = new ServerSocket(8888);
// 監聽客戶端連接,返回相應的Socket對象
Socket s = ss.accept();
// 獲取輸入流對象,從輸入流中獲取數據
InputStream is = s.getInputStream();
byte[] bys = new byte[1024];
int len = is.read(bys);
String str = new String(bys, 0, len);
System.out.println("From Client" + "(" + s.getInetAddress().getHostAddress() + "):" + str);
// 釋放資源
s.close();
}
}
客戶端代碼:
package TCP數據發送與接收;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
public class ClientDemo {
public static void main(String[] args) throws IOException {
// 創建Socket套接字對象
Socket s = new Socket("59.71.66.152", 8888);
// 獲取輸出流對象,寫數據
OutputStream os = s.getOutputStream();
os.write("hello,世界".getBytes());
// 釋放資源
s.close();
}
}