UDP傳輸協議:
一種無連接的傳輸層協議,提供面向事務的簡單不可靠信息傳送服務。
特點:
· 非面向連接,傳輸不可靠,可能丟失
· 發送不管對方是否準備好,接收方收到也不確認
· 可以廣播發送
· 非常簡單的協議,開銷小
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
import java.net.SocketException;
/**
* 發送端
*/
public class TalkSend implements Runnable {
private DatagramSocket client; //套接字
private BufferedReader reader; //字符緩衝流
private String toIP; //接收端的域名
private int toPort; //接收端的端口
public TalkSend(int port, String toIP, int toPort) {
this.toIP = toIP;
this.toPort = toPort;
try {
client = new DatagramSocket(port);
reader = new BufferedReader(new InputStreamReader(System.in));
} catch (SocketException e) {
e.printStackTrace();
}
}
@Override
public void run() {
while(true) {
String data;
try {
data = reader.readLine();
byte[] datas = data.getBytes();
//封裝成DatagramPacket包裹,需要指定目的地
DatagramPacket packet = new DatagramPacket(datas, 0, datas.length, new InetSocketAddress(toIP, toPort));
//發送包裹send(DatagramPacket p)
client.send(packet);
if(data.equals("bye"))
break;
} catch (IOException e) {
e.printStackTrace();
}
}
client.close();
}
}
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
/**
* 接收端:使用面向對象封裝
*/
public class TalkReceive implements Runnable {
DatagramSocket server; //套接字
private String from;
public TalkReceive(int port, String from) {
this.from = from;
try {
this.server = new DatagramSocket(port);
} catch (SocketException e) {
e.printStackTrace();
}
}
@Override
public void run() {
while(true) {
byte[] container = new byte[1024 * 60]; //發過來的東西不能太大
DatagramPacket packet = new DatagramPacket(container, 0, container.length);
//阻塞式接收包裹receive(DatagramPacket p)
try {
server.receive(packet);
//分析數據
byte[] datas = packet.getData();
String msg = new String(datas, 0, packet.getLength());
System.out.println(from + ":" + msg);
if(msg.equals("bye"))
break;
} catch (IOException e) {
e.printStackTrace();
}
}
//釋放資源
server.close();
}
}
/**
* 加入多線程,實現雙向交流 模擬在線諮詢
*/
public class TalkStudent {
public static void main(String[] args) {
new Thread(new TalkSend(7777, "localhost", 9999)).start(); //發送
new Thread(new TalkReceive(8888, "老師")).start(); //接收
}
}
public class TalkTeacher {
public static void main(String[] args) {
new Thread(new TalkReceive(9999, "學生")).start(); //接收
new Thread(new TalkSend(5555, "localhost", 8888)).start(); //發送
}
}