• UDP网络通信收发包原理即代码


    UDP网络通信的发包过程

    1、使用DatagramSocket()创建一个数据包套接字。

    2、使用DatagramPacket(byte[]buf, int offset, int length, InetAddress address, int port)创建要发送的数据包。

    3、使用DatagramSocket类的send()方法数据包

     UDP网络通信的收包过程

    1、使用DatagramSocket(int)创建一个数据包套接字,绑定到指定的端口。

    2、使用DatagramPacket(byte[]buf,int length)创建字节数组来接收数据包.

    3、使用DatagramSocket类的receive()方法接收UDP获取的数据实际上就存储在创建空包的数组种,转换显示时建议设置长度

    System.out.println(dp.getLength()); //数据的具体长度

    String str=new String(buffer,0,dp.getLength());

    一般来说UDP协议的最大数据包的长度64k

    多播或者组播的实现

    代码实现

    1. import java.io.FileWriter;
    2. import java.io.PrintWriter;
    3. import java.net.DatagramPacket;
    4. import java.net.DatagramSocket;
    5. import java.net.SocketException;
    6. public class Rec {
    7. public static void main(String[] args) throws Exception {
    8. DatagramSocket ds = new DatagramSocket(9999);
    9. byte[] buffer = new byte[8192];
    10. DatagramPacket dp=new DatagramPacket(buffer, buffer.length);
    11. ds.receive(dp);
    12. System.out.println(dp.getLength()); //数据的具体长度
    13. String str=new String(buffer,0,dp.getLength());
    14. System.out.println(str);
    15. ds.close();
    16. PrintWriter pw=new PrintWriter(new FileWriter("d:/bbb.txt"));
    17. pw.println(str);
    18. pw.close();
    19. }
    20. }
    1. import java.net.DatagramPacket;
    2. import java.net.DatagramSocket;
    3. import java.net.InetAddress;
    4. import java.net.SocketException;
    5. public class Send {
    6. public static void main(String[] args) throws Exception {
    7. DatagramSocket ds = new DatagramSocket();
    8. String msg = "现在几点了?";
    9. byte[] data = msg.getBytes();
    10. DatagramPacket dp = new DatagramPacket(data, data.length, InetAddress.getByName("localhost"), 9999);
    11. ds.send(dp);
    12. ds.close();
    13. }
    14. }

     

    真正聊天室的实现原理

    MulticastSocket可以将数据报以广播的方式发送给加入指定组的所有客户端

    组播是指把信息同时传递给一组目的地址。它使用的策略是最高效的,因为消息在每条网络链路上只需传递一次,且

    只有在链路分叉的时候,消息才会被复制。与多播相比,常规的点到单点传递被称作单播。当以单播的形式把消息传

    递给多个接收方时,必须向每个接收者都发送一份数据副本。由此产生的多余副本将导致发送方效率低下,且缺乏可

    扩展性。不过,许多流行的协议——例如XMPP,用限制接收者数量的方法弥补了这一不足

     

    1. import java.io.IOException;
    2. import java.net.DatagramPacket;
    3. import java.net.InetAddress;
    4. import java.net.MulticastSocket;
    5. public class Rev {
    6. public static void main(String[] args) throws Exception {
    7. MulticastSocket ms=new MulticastSocket(9999);
    8. InetAddress ia=InetAddress.getByName("225.0.0.1");
    9. ms.joinGroup(ia);
    10. byte[] buffer=new byte[8192];
    11. DatagramPacket dp=new DatagramPacket(buffer, buffer.length);
    12. ms.receive(dp);
    13. System.out.println(dp.getAddress());
    14. System.out.println(dp.getPort());
    15. String str=new String(buffer,0,dp.getLength());
    16. System.out.println(str);
    17. ms.close();
    18. }
    19. }

     

    1. import java.io.IOException;
    2. import java.net.DatagramPacket;
    3. import java.net.InetAddress;
    4. import java.net.MulticastSocket;
    5. public class Revs {
    6. public static void main(String[] args) throws Exception {
    7. MulticastSocket ms = new MulticastSocket(9999);
    8. InetAddress ia = InetAddress.getByName("225.0.0.1");
    9. ms.joinGroup(ia);
    10. byte[] buffer = new byte[8192];
    11. DatagramPacket dp = new DatagramPacket(buffer, buffer.length);
    12. Thread t1=new Thread() {
    13. public void run() {
    14. while (true)
    15. try {
    16. ms.receive(dp);
    17. String str = new String(buffer, 0, dp.getLength());
    18. System.out.println(str);
    19. } catch (IOException e) {
    20. e.printStackTrace();
    21. }
    22. }
    23. };
    24. t1.setDaemon(true);
    25. t1.start();
    26. }
    27. }
    1. import java.net.DatagramPacket;
    2. import java.net.InetAddress;
    3. import java.net.MulticastSocket;
    4. import java.util.Date;
    5. public class Send {
    6. public static void main(String[] args) throws Exception {
    7. MulticastSocket ms = new MulticastSocket(8000);
    8. for (int i = 0; i < 10; i++) {
    9. String msg = "达到王金西" + new Date();
    10. byte[] data = msg.getBytes();
    11. DatagramPacket dp = new DatagramPacket(data, data.length, InetAddress.getByName("225.0.0.1"), 9999);
    12. ms.send(dp);
    13. Thread.sleep(1000);
    14. }
    15. ms.close();
    16. }
    17. }

     

    ## 代理服务器的使用

    JDK1.5提供了Proxy和ProxySelector类来实现代理访问。

    Proxy代表一个代理服务器,可以在打开URLConnection连接时指定代理,也可以在创建Socket连接时指定代理。

    ProxySelector是一个代理选择器,提供了对代理服务器更加灵活的控制,可以对http\https\ftp\socket等进

    行分别设置,还可以设置不需要通过代理服务器的主机和地址

    代理服务器的功能

    - 突破自身IP限制

    - 提高访问速度

  • 相关阅读:
    Unity 手动编译 Reload脚本 减少等待时间
    【Harmony OS】【JAVA UI】鸿蒙应用如何集成OKHttp网络三方库
    游戏开发36课 cocoscreator scrollview优化
    PreparedStatement vs Statement 不同及其使用
    前端学习笔记005:数据传输 + AJAX + axios
    从react源码看hooks的原理
    Transformer学习
    LQ0197 锦标赛【程序填空】
    对各种指针,数组的联立回顾复习(字符指针,指针数组,数组指针,函数指针,函数指针数组)
    开源:Taurus.DistributedLock 分布式锁框架,支持 .Net 和 .Net Core 双系列版本
  • 原文地址:https://blog.csdn.net/zjh0101/article/details/126880253