一、使用udp模擬客戶端與服務(wù)端收發(fā)數(shù)據(jù)案例: 客戶端向服務(wù)端發(fā)送字符串,服務(wù)端接收后打印。 注意:服務(wù)端與客戶端的不同點(diǎn)是DatagramPacket既可以用于作為發(fā)送數(shù)據(jù)包,也可以用于接收數(shù)據(jù)包,只不過發(fā)送數(shù)據(jù)包多了服務(wù)器ip地址和端口信息。 1.服務(wù)端
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
/**
* 服務(wù)端
* 1.創(chuàng)建服務(wù)端+接口
* 2.準(zhǔn)備接收容器
* 3.封裝成包
* 4.接收數(shù)據(jù)
* 5.分析數(shù)據(jù)
* 6.釋放資源
*/
public class MyServer {
public static void main(String[] args) throws IOException {
//1.創(chuàng)建服務(wù)端+接口
DatagramSocket server = new DatagramSocket(8888);
//2.準(zhǔn)備接收容器
byte[] container = new byte[1024];
//3.封裝成包new DatagramPacket(byte[] buf, int length)用于接收
DatagramPacket packet = new DatagramPacket(container, container.length);
//4.接收數(shù)據(jù)
server.receive(packet);//會被阻塞住,直到接收到數(shù)據(jù)。
//5.分析數(shù)據(jù)
byte[] data = packet.getData();
int len = packet.getLength();
System.out.println(new String(data, 0, len));
//6.釋放資源
server.close();
}
}
2.客戶端
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
/**
* 客戶端
* 1.創(chuàng)建客戶端+端口
* 2.準(zhǔn)備數(shù)據(jù)
* 3.打包(發(fā)送的地點(diǎn)及端口)
* 4.發(fā)送
* 5.釋放
*/
public class MyClient {
public static void main(String[] args) throws IOException {
//1.創(chuàng)建客戶端 +端口
DatagramSocket client = new DatagramSocket(6666);
//2.準(zhǔn)備數(shù)據(jù)
String msg = "hello你好!";
byte[] data = msg.getBytes();
//3.打包(發(fā)送的地址及端口)
//new DatagramPacket(byte buf[], int offset, int length, SocketAddress address)用于發(fā)送
//DatagramPacket(byte buf[], int length, SocketAddress address)用于發(fā)送
DatagramPacket packet = new DatagramPacket(data, data.length, new InetSocketAddress("localhost", 8888));
//4.發(fā)送
client.send(packet);//不會被阻塞住,發(fā)完就結(jié)束,不保證數(shù)據(jù)一定被接收。
//5.釋放
client.close();
}
}
二、使用udp模擬客戶端與服務(wù)端收發(fā)特定數(shù)據(jù)類型案例: 客戶端發(fā)送double類型數(shù)據(jù),服務(wù)端接收double類型數(shù)據(jù)并打印。 1.服務(wù)端
import java.io.ByteArrayInputStream;
import java.io.DataInputStream;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
/**
* 服務(wù)端
* 1.創(chuàng)建服務(wù)端+接口
* 2.準(zhǔn)備接收容器
* 3.封裝成包
* 4.接收數(shù)據(jù)
* 5.分析數(shù)據(jù) 字節(jié)數(shù)組-->double
* 6.釋放資源
*/
public class MyServer {
public static void main(String[] args) throws IOException {
//1.創(chuàng)建服務(wù)端+接口
DatagramSocket server = new DatagramSocket(8888);
//2.準(zhǔn)備接收容器
byte[] container = new byte[1024];
//3.封裝成包new DatagramPacket(byte[] buf, int length)用于接收
DatagramPacket packet = new DatagramPacket(container, container.length);
//4.接收數(shù)據(jù)
server.receive(packet);//會被阻塞住,直到接收到數(shù)據(jù)。
//5.分析數(shù)據(jù)------------------------------->只有這步做了更改。
double data = convert(packet.getData());
System.out.println(data);
//6.釋放資源
server.close();
}
/**
* 字節(jié)數(shù)組-->double,注意是使用ByteArrayInputStream,當(dāng)成String傳輸也可以。
*/
public static double convert(byte[] data) throws IOException {
ByteArrayInputStream bStream = new ByteArrayInputStream(data);
DataInputStream dStream = new DataInputStream(bStream);
//獲取數(shù)據(jù)
double num = dStream.readDouble();
//關(guān)閉流
dStream.close();
bStream.close();
return num;
}
}
2.客戶端
import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
/**
* 客戶端
* 1.創(chuàng)建客戶端+端口
* 2.準(zhǔn)備數(shù)據(jù) double-->字節(jié)數(shù)組 字節(jié)數(shù)組輸出流
* 3.打包(發(fā)送的地點(diǎn)及端口)
* 4.發(fā)送
* 5.釋放
*/
public class MyClient {
public static void main(String[] args) throws IOException {
//1.創(chuàng)建客戶端 +端口
DatagramSocket client = new DatagramSocket(6666);
//2.準(zhǔn)備數(shù)據(jù)--------------------------------->注意只有這步做了更改。
double num = 3.14;
byte[] data = convert(num);
//3.打包(發(fā)送的地址及端口)
//new DatagramPacket(byte buf[], int offset, int length, SocketAddress address)用于發(fā)送
//DatagramPacket(byte buf[], int length, SocketAddress address)用于發(fā)送
DatagramPacket packet = new DatagramPacket(data, data.length, new InetSocketAddress("localhost", 8888));
//4.發(fā)送
client.send(packet);//不會被阻塞住,發(fā)完就結(jié)束,不保證數(shù)據(jù)一定被接收。
//5.釋放
client.close();
}
/**
* double-->字節(jié)數(shù)組,注意是使用ByteArrayOutputStream,當(dāng)成String傳輸也可以。
*/
public static byte[] convert(double num) throws IOException {
byte[] data = null;
ByteArrayOutputStream bStream = new ByteArrayOutputStream();
DataOutputStream dStream = new DataOutputStream(bStream);
//將數(shù)據(jù)寫入ByteArrayOutputStream對象中
dStream.writeDouble(num);
//轉(zhuǎn)化并獲取數(shù)據(jù)
data = bStream.toByteArray();
//關(guān)閉流
dStream.close();
bStream.close();
return data;
}
}
更多建議: