• 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限制

    - 提高访问速度

  • 相关阅读:
    胺液(MDEA)净化树脂A-98FM
    nginx配置https访问 生成ssl自签名证书,浏览器直接访问
    精选112个炫酷大数据可视化大屏模板(含源码),拿走即用
    《Linux》day5--ssh——ssh登录与scp传文件
    JPA 分页
    反转问题(字符串和链表)
    神经网络基础知识总结与理解
    [其他]IDEA中Maven项目配置国内源
    让历史文化“活”起来,北京河图“万象中轴”助力打造北京城市金名片
    【MySQL】索引
  • 原文地址:https://blog.csdn.net/zjh0101/article/details/126880253