美文网首页
网络编程之UDP

网络编程之UDP

作者: 安安静静写代码 | 来源:发表于2017-08-23 08:54 被阅读14次

TCP(面向链接) 在正式收发数据前,必须和对方建立可靠的链接
特点:安全(面向链接,保证对象一定能收到数据),传输数据大小无限制
缺点:效率低(因为有三次握手)

UDP和TCP一样是面向无连接的传输层协议,提供面向事务的简单不可靠信息传送服务
特点:无连接,安全,可靠性不高,效率高
发送方->接受方
1.创建DatagramSocket
2.准备要发送的数据
3.将发送的数据放到包裹里面
4.通过DatagramSocket将包裹发送出去
5.关闭Socket
发送方

1.不需要地址和端口号
DatagramSocket socket = new DatagramSocket();
String str = "好开心啊";
DatagramPack pack = new DatagramPacket(str.getBytes(),str.length,127.0.0.1,2333)
Socket.send(packet);

接收方

DatagramSocket socket  = new DatagramSocket(2333);
byte[] buf = new byte[1024];
DatagramPacket packet = new DatagramPacket(buf,length);
//阻塞程序向下进行
socket.receve(packet);
String str = new String(packet.getData(),0,pack.length);
System.out.println(str);

利用udp实现互相聊天

服务端

package com.qf.demo3;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.InterfaceAddress;
import java.net.SocketException;
import java.util.Scanner;

public class Recive {

    public static void main(String[] args) {
        // 1 接收方的socket需要端口号
        DatagramSocket socket = null;
        try {
            socket = new DatagramSocket(5577);
            Scanner in = new Scanner(System.in);
            while (true) {
                // 接收
                byte[] buf = new byte[1024];
                DatagramPacket p = new DatagramPacket(buf, buf.length);
                socket.receive(p);
                String string = new String(p.getData(), 0, p.getLength());
                System.out.println("发送方发送的" + string + " " + p.getAddress().getHostAddress());
                // 回复数据
                System.out.println("包裹端口:"+p.getPort());
                System.out.println("请输入回复内容:");
                String string2 = in.next();
                
                DatagramPacket packet = new DatagramPacket(string2.getBytes(), string2.getBytes().length,
                     InetAddress.getLocalHost(), p.getPort());
                
                socket.send(packet);
            }
        } catch (SocketException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally {
            if (socket != null) {
                socket.close();
            }
        }

    }
}

客户端

package com.qf.demo3;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.util.Scanner;

/**
 * 1 发送方: socket 没有参数的 接收方 : socket 是有端口号
 * 2 send 的 packet 是带有 byte lenth InetAddress port receive的 packet 是带有 byte
 * lenth
 * 作业: 实现循环的发送和接收 数据由控制台输入
 */
public class Send {

    public static void main(String[] args) {

        // 1 发送方的快递点不需要参数
        DatagramSocket socket = null;
        Scanner in = new Scanner(System.in); 
        try {
            socket = new DatagramSocket();
            while (true) {
                // 2
                System.out.println("请输入内容:");
                String string = in.next();
                // 3 将数据放到包裹里面
                DatagramPacket packet = new DatagramPacket(string.getBytes(), string.getBytes().length,
                        InetAddress.getLocalHost(), 5577);
                // 4 发送
                socket.send(packet);

                // 接收 接收端的 回复
                byte[] buf = new byte[1024 * 63];
                DatagramPacket p = new DatagramPacket(buf, buf.length);
                socket.receive(p);

                String string2 = new String(p.getData(), 0, p.getLength());
                System.out.println("接收方回复" + string2);
            }
        } catch (SocketException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (UnknownHostException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally {
            if (socket != null) {
                socket.close();
            }
        }
    }
}

相关文章

  • 网络编程之UDP

    TCP(面向链接) 在正式收发数据前,必须和对方建立可靠的链接特点:安全(面向链接,保证对象一定能收到数据),传输...

  • 网络编程三——TCP和UDP

    学习链接 这篇介绍TPC和UDP的文章,讲解得十分详细易懂:Android 网络编程之TCP、UDP详解。 我在这...

  • 网络编程之UDP编程

    UDP编程     UDP:User Datagram Protocal 用户数据报协议,是 OSI/RM 模型中...

  • Java网络编程之UDP协议

    今天我们来聊聊 网络编程这部分的内容 网络编程 1)计算机网络 是指将地理位置不同的具有独立功能的多台计算机及其外...

  • python 网络编程之UDP编程

    UDP编程 TCP是建立可靠连接,并且通信双方都可以以流的形式发送数据。相对TCP,UDP则是面向无连接的协议。 ...

  • 网络编程之Sockets通讯-UDP

    Unix中一切皆文件 读写I/O,其实是读写文件描述符fd,虽然它只是关联到这个文件的一个integer而已。FI...

  • 《计算机网络——自顶向下方法》运输层——无连接运输:UDP

    无连接运输:UDP 运输层最低限度必须提供一种复用、分解服务,以便在网络层与正确的应用及进程之间传递数据。UDP就...

  • Java网络编程之UDP网络通信

    1 网络编程----UDPNo25 【Scanner scanner =new Scanner(System....

  • Python UDP编程

    Python网络编程之UDP 一、Socket 网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一...

  • 计算机网络第三章

    运输层和网络层的关系 运输层(TCP或UDP)为运行在不同主机上的进程之间提供逻辑通信网络层(IP协议)提供了主机...

网友评论

      本文标题:网络编程之UDP

      本文链接:https://www.haomeiwen.com/subject/boardxtx.html