UDP

2019-07-09 22:33 更新

一、使用udp模擬客戶端與服務端收發(fā)數(shù)據(jù)案例: 客戶端向服務端發(fā)送字符串,服務端接收后打印。 注意:服務端與客戶端的不同點是DatagramPacket既可以用于作為發(fā)送數(shù)據(jù)包,也可以用于接收數(shù)據(jù)包,只不過發(fā)送數(shù)據(jù)包多了服務器ip地址和端口信息。 1.服務端

  1. import java.io.IOException;
  2. import java.net.DatagramPacket;
  3. import java.net.DatagramSocket;
  4. /**
  5. * 服務端
  6. * 1.創(chuàng)建服務端+接口
  7. * 2.準備接收容器
  8. * 3.封裝成包
  9. * 4.接收數(shù)據(jù)
  10. * 5.分析數(shù)據(jù)
  11. * 6.釋放資源
  12. */
  13. public class MyServer {
  14. public static void main(String[] args) throws IOException {
  15. //1.創(chuàng)建服務端+接口
  16. DatagramSocket server = new DatagramSocket(8888);
  17. //2.準備接收容器
  18. byte[] container = new byte[1024];
  19. //3.封裝成包new DatagramPacket(byte[] buf, int length)用于接收
  20. DatagramPacket packet = new DatagramPacket(container, container.length);
  21. //4.接收數(shù)據(jù)
  22. server.receive(packet);//會被阻塞住,直到接收到數(shù)據(jù)。
  23. //5.分析數(shù)據(jù)
  24. byte[] data = packet.getData();
  25. int len = packet.getLength();
  26. System.out.println(new String(data, 0, len));
  27. //6.釋放資源
  28. server.close();
  29. }
  30. }

2.客戶端

  1. import java.io.IOException;
  2. import java.net.DatagramPacket;
  3. import java.net.DatagramSocket;
  4. import java.net.InetSocketAddress;
  5. /**
  6. * 客戶端
  7. * 1.創(chuàng)建客戶端+端口
  8. * 2.準備數(shù)據(jù)
  9. * 3.打包(發(fā)送的地點及端口)
  10. * 4.發(fā)送
  11. * 5.釋放
  12. */
  13. public class MyClient {
  14. public static void main(String[] args) throws IOException {
  15. //1.創(chuàng)建客戶端 +端口
  16. DatagramSocket client = new DatagramSocket(6666);
  17. //2.準備數(shù)據(jù)
  18. String msg = "hello你好!";
  19. byte[] data = msg.getBytes();
  20. //3.打包(發(fā)送的地址及端口)
  21. //new DatagramPacket(byte buf[], int offset, int length, SocketAddress address)用于發(fā)送
  22. //DatagramPacket(byte buf[], int length, SocketAddress address)用于發(fā)送
  23. DatagramPacket packet = new DatagramPacket(data, data.length, new InetSocketAddress("localhost", 8888));
  24. //4.發(fā)送
  25. client.send(packet);//不會被阻塞住,發(fā)完就結(jié)束,不保證數(shù)據(jù)一定被接收。
  26. //5.釋放
  27. client.close();
  28. }
  29. }

二、使用udp模擬客戶端與服務端收發(fā)特定數(shù)據(jù)類型案例: 客戶端發(fā)送double類型數(shù)據(jù),服務端接收double類型數(shù)據(jù)并打印。 1.服務端

  1. import java.io.ByteArrayInputStream;
  2. import java.io.DataInputStream;
  3. import java.io.IOException;
  4. import java.net.DatagramPacket;
  5. import java.net.DatagramSocket;
  6. /**
  7. * 服務端
  8. * 1.創(chuàng)建服務端+接口
  9. * 2.準備接收容器
  10. * 3.封裝成包
  11. * 4.接收數(shù)據(jù)
  12. * 5.分析數(shù)據(jù) 字節(jié)數(shù)組-->double
  13. * 6.釋放資源
  14. */
  15. public class MyServer {
  16. public static void main(String[] args) throws IOException {
  17. //1.創(chuàng)建服務端+接口
  18. DatagramSocket server = new DatagramSocket(8888);
  19. //2.準備接收容器
  20. byte[] container = new byte[1024];
  21. //3.封裝成包new DatagramPacket(byte[] buf, int length)用于接收
  22. DatagramPacket packet = new DatagramPacket(container, container.length);
  23. //4.接收數(shù)據(jù)
  24. server.receive(packet);//會被阻塞住,直到接收到數(shù)據(jù)。
  25. //5.分析數(shù)據(jù)------------------------------->只有這步做了更改。
  26. double data = convert(packet.getData());
  27. System.out.println(data);
  28. //6.釋放資源
  29. server.close();
  30. }
  31. /**
  32. * 字節(jié)數(shù)組-->double,注意是使用ByteArrayInputStream,當成String傳輸也可以。
  33. */
  34. public static double convert(byte[] data) throws IOException {
  35. ByteArrayInputStream bStream = new ByteArrayInputStream(data);
  36. DataInputStream dStream = new DataInputStream(bStream);
  37. //獲取數(shù)據(jù)
  38. double num = dStream.readDouble();
  39. //關(guān)閉流
  40. dStream.close();
  41. bStream.close();
  42. return num;
  43. }
  44. }

2.客戶端

  1. import java.io.ByteArrayOutputStream;
  2. import java.io.DataOutputStream;
  3. import java.io.IOException;
  4. import java.net.DatagramPacket;
  5. import java.net.DatagramSocket;
  6. import java.net.InetSocketAddress;
  7. /**
  8. * 客戶端
  9. * 1.創(chuàng)建客戶端+端口
  10. * 2.準備數(shù)據(jù) double-->字節(jié)數(shù)組 字節(jié)數(shù)組輸出流
  11. * 3.打包(發(fā)送的地點及端口)
  12. * 4.發(fā)送
  13. * 5.釋放
  14. */
  15. public class MyClient {
  16. public static void main(String[] args) throws IOException {
  17. //1.創(chuàng)建客戶端 +端口
  18. DatagramSocket client = new DatagramSocket(6666);
  19. //2.準備數(shù)據(jù)--------------------------------->注意只有這步做了更改。
  20. double num = 3.14;
  21. byte[] data = convert(num);
  22. //3.打包(發(fā)送的地址及端口)
  23. //new DatagramPacket(byte buf[], int offset, int length, SocketAddress address)用于發(fā)送
  24. //DatagramPacket(byte buf[], int length, SocketAddress address)用于發(fā)送
  25. DatagramPacket packet = new DatagramPacket(data, data.length, new InetSocketAddress("localhost", 8888));
  26. //4.發(fā)送
  27. client.send(packet);//不會被阻塞住,發(fā)完就結(jié)束,不保證數(shù)據(jù)一定被接收。
  28. //5.釋放
  29. client.close();
  30. }
  31. /**
  32. * double-->字節(jié)數(shù)組,注意是使用ByteArrayOutputStream,當成String傳輸也可以。
  33. */
  34. public static byte[] convert(double num) throws IOException {
  35. byte[] data = null;
  36. ByteArrayOutputStream bStream = new ByteArrayOutputStream();
  37. DataOutputStream dStream = new DataOutputStream(bStream);
  38. //將數(shù)據(jù)寫入ByteArrayOutputStream對象中
  39. dStream.writeDouble(num);
  40. //轉(zhuǎn)化并獲取數(shù)據(jù)
  41. data = bStream.toByteArray();
  42. //關(guān)閉流
  43. dStream.close();
  44. bStream.close();
  45. return data;
  46. }
  47. }
以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號