• socket与tcp udp两种协议的关系


    java.net 包中提供了两种常见的网络协议的支持:

    • TCP:TCP(英语:Transmission Control Protocol,传输控制协议) 是一种面向连接的、可靠的、基于字节流的传输层通信协议,TCP 层是位于 IP 层之上,应用层之下的中间层。TCP 保障了两个应用程序之间的可靠通信。通常用于互联网协议,被称 TCP / IP。

    • UDP:UDP (英语:User Datagram Protocol,用户数据报协议),位于 OSI 模型的传输层。一个无连接的协议。提供了应用程序之间要发送数据的数据报。由于UDP缺乏可靠性且属于无连接协议,所以应用程序通常必须容许一些丢失、错误或重复的数据包

    应用:

      TCP:java.net.ServerSocket     

      UDP:java.net.DatagramSocket

    这样就很简单了,用什么协议就用对应的接口。

    这里写个使用udp的小例子

     DatagramSocket ds=new DatagramSocket(8888);//创建接收端,确立端口,与发送端建立关系
            DatagramPacket dp=new DatagramPacket(new byte[1024],1024);//创建数据包,用于接收长度为1024的数据
            ds.receive(dp);//接收数据,将DatagramSocket的数据搬运到DatagramPacket里
            byte[] date = dp.getData();//获取数据,把数据包里的数据拆出来,装到byte字节数组
            int len=dp.getLength();//获取数据包里数据长度
            log.info(new String(date,0,len));
            ds.close();
     String str="你好呀,我是你mama介绍的";
            DatagramSocket ds=new DatagramSocket();//创建发送端
            DatagramPacket dp=new DatagramPacket(str.getBytes(),str.getBytes().length, InetAddress.getByName("127.0.0.1"),8888);//创建数据包,将数据拆分,打包
         //getByName参数可以写目标主机名、也可以写目标ip地址      
         ds.send(dp);//发送 ds.close();

     例子二:

     DatagramSocket ds = new DatagramSocket(6666); // 监听指定端口
            for (;;) { // 无限循环
                // 数据缓冲区:
                byte[] buffer = new byte[1024];
                System.out.println(1);
                DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
                System.out.println(2);
                ds.receive(packet); // 收取一个UDP数据包.阻塞等待客户端请求
                System.out.println(3);
                // 收取到的数据存储在buffer中,由packet.getOffset(), packet.getLength()指定起始位置和长度
                // 将其按UTF-8编码转换为String:
                String s = new String(packet.getData(), packet.getOffset(), packet.getLength(), StandardCharsets.UTF_8);
                System.out.println(s);
                // 发送数据:
                byte[] data = "ACK".getBytes(StandardCharsets.UTF_8);
                packet.setData(data);
                ds.send(packet);
     DatagramSocket ds = new DatagramSocket();
            ds.setSoTimeout(1000);
            ds.connect(InetAddress.getByName("localhost"), 6666); // 连接指定服务器和端口
    // 发送:
            byte[] data = "Hello".getBytes();
            DatagramPacket packet = new DatagramPacket(data, data.length);
            ds.send(packet);
    // 接收:
            byte[] buffer = new byte[1024];
            packet = new DatagramPacket(buffer, buffer.length);
            ds.receive(packet);
            String resp = new String(packet.getData(), packet.getOffset(), packet.getLength());
            System.out.println("服务器返回数据:"+resp);
            ds.disconnect();//close()是完全关闭资源,disconnect()不是真正地断开连接,它只是清除了客户端DatagramSocket实例记录的远程服务器地址和端口号,
    这样,DatagramSocket实例就可以连接另一个服务器端
  • 相关阅读:
    动态规划之最大子序和(53)
    退出系统
    请维护容差码的容差限制-OMR6
    SAP561该物料不可能有库存记帐
    虚拟机锁定文件失败,disk启动失败
    该物料不可能有库存记账
    其他收货入库
    有关业务 事件类型wa 在 的号码范围不存在
    给供应商付款
    T169V表目:不存在
  • 原文地址:https://www.cnblogs.com/hebiao/p/14422255.html
Copyright © 2020-2023  润新知