發送端
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
/*
流程:
1. 創建UDP服務器對應的發送端Socket
2. 準備對應數據包,需要帶有指定數據
3. 發送數據 send
4. 關閉UDP發送端
*/
public class SenderDemo1 {
public static void main(String[] args) throws IOException {
System.out.println("發送端啓動");
// 創建對應的Socket
DatagramSocket socket = new DatagramSocket();
// 準備數據包
byte[] bytes = "今天中午喫蒸羊羔...".getBytes();
DatagramPacket packet = new DatagramPacket(bytes, // 字節數組數據
bytes.length, // 字節數組數據長度
InetAddress.getLocalHost(), // 指定接收端IP地址
8848); // 8848對應端口號
// 發送數據包
socket.send(packet);
// 關閉UDP發送端
socket.close();
}
}
接收端
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
/*
流程:
1. 打開UDP服務,並且監聽指定端口
2. 創建新的空數據包
3. 通過Socket接收數據 receive
4. 關閉UDP服務接收端
*/
public class ReceiveDemo1 {
public static void main(String[] args) throws IOException {
// 創建Socket監聽端口
DatagramSocket socket = new DatagramSocket(8848);
// 準備空數據包
byte[] buf = new byte[1024];
DatagramPacket packet = new DatagramPacket(buf, buf.length);
// 接收數據
socket.receive(packet);
// 確定接收到的字節長度
int length = packet.getLength();
System.out.println(new String(buf, 0, length));
// 關閉socket
socket.close();
}
}
UDP數據傳遞丟失問題
- 網絡不夠好,穩定性不行,帶寬不夠
- 電腦性能不好
2. TCP
2.1 TCP概述
TCP相對於UDP比較穩定的傳輸協議,這裏存在三次握手,保證連接狀態,同時有明確的客戶端和服務端之分
TCP服務中需要服務器端先啓動,需要監聽指定端口,等待客戶端連接。
客戶端主動連接服務器,和服務器連接之後,纔可以進行數據交互,服務器不能主動連接客戶端的。
TCP操作而言,Java中提供了兩個Socket
- 服務端Socket
java.net.ServerSocket;
創建對應的ServerScoket開啓服務器,等待客戶端連接。 - 客戶端Socket
java.net.Socket
創建客戶端Scoket,並且連接服務器,同時將Socket發送給服務器綁定註冊。
2.2 Socket 客戶端Socket
構造方法 Constructor
Socket(String host, int port);
host是服務器IP地址,port對應服務器程序的端口號
通過指定的服務器IP地址和端口號,獲取TCP連接對象
成員方法 Method
InputStream getInputStream();
獲取Socket對象輸入字節流,可以從服務器獲取對應的數據
InputStream是一個資源,需要在程序退出是關閉
Read
OutputStream getOutputStream();
獲取Sokcet對象輸出字節流,可以發送數據到服務器
OutputStream是一個資源,需要在程序退出是關閉
Write
void close();
關閉客戶端Socket
void shutdownOutput();
禁止當前Socket發送數據
TCP/IP協議對應的Socket是給予IO流實現的
2.3 ServerSocket服務端Socket
在服務端開啓Socket服務器
構造方法 Constructor:
ServerSocket(int port);
開啓ServerSocket服務器,並且明確當前服務端口是誰
成員方法 Method:
Socket accept();
監聽並且連接,得到一個Socket對象,同時該方法是一個阻塞方法,會處於一個始終的監聽狀態
返回的是Socket,也就是客戶端Socket對象,獲取到當前Socket對象,相對於獲取到客戶端連接,同時使用的Socket和客戶端一致。