JAVA问题 UDP协议中的端口问题

JAVA问题 UDP协议中的端口问题,第1张

在Java中 *** 纵UDP

使用位于JDK中Javanet包下的DatagramSocket和DatagramPacket类,可以非常方便地控制用户数据报文

在描述它们之前,必须了解位于同一个位置的InetAddress类。InetAddress实现了Javaio Serializable接口,不允许继承。它用于描述和包装一个Internet IP地址,通过三个方法返回InetAddress实例:

getLocalhost():返回封装本地地址的实例。

getAllByName(String host):返回封装Host地址的InetAddress实例数组。

getByName(String host):返回一个封装Host地址的实例。其中,Host可以是域名或者是一个合法的IP地址。

DatagramSocket类用于创建接收和发送UDP的Socket实例。和Socket类依赖SocketImpl类一样,DatagramSocket类的实现也依靠专门为它设计的DatagramScoketImplFactory类。DatagramSocket类有3个构建器:

DatagramSocket():创建实例。这是个比较特殊的用法,通常用于客户端编程,它并没有特定监听的端口,仅仅使用一个临时的。

DatagramSocket(int port):创建实例,并固定监听Port端口的报文。

DatagramSocket(int port, InetAddress localAddr):这是个非常有用的构建器,当一台机器拥有多于一个IP地址的时候,由它创建的实例仅仅接收来自LocalAddr的报文。

值得注意的是,在创建DatagramSocket类实例时,如果端口已经被使用,会产生一个SocketException的异常抛出,并导致程序非法终止,这个异常应该注意捕获。DatagramSocket类最主要的方法有4个:

Receive(DatagramPacket d):接收数据报文到d中。receive方法产生一个“阻塞”。

Send(DatagramPacket d):发送报文d到目的地。

SetSoTimeout(int timeout):设置超时时间,单位为毫秒。

Close():关闭DatagramSocket。在应用程序退出的 焙颍ǔ;嶂鞫头抛试矗乇誗ocket,但是由于异常地退出可能造成资源无法回收。所以,应该在程序完成时,主动使用此方法关闭Socket,或在捕获到异常抛出后关闭Socket。

“阻塞”是一个专业名词,它会产生一个内部循环,使程序暂停在这个地方,直到一个条件触发。

DatagramPacket类用于处理报文,它将Byte数组、目标地址、目标端口等数据包装成报文或者将报文拆卸成Byte数组。应用程序在产生数据包是应该注意,TCP/IP规定数据报文大小最多包含65507个,通常主机接收548个字节,但大多数平台能够支持8192字节大小的报文。DatagramPacket类的构建器共有4个:

DatagramPacket(byte[] buf, int length, InetAddress addr, int port):从Buf数组中,取出Length长的数据创建数据包对象,目标是Addr地址,Port端口。

DatagramPacket(byte[] buf, int offset, int length, InetAddress address, int port):从Buf数组中,取出Offset开始的、Length长的数据创建数据包对象,目标是Addr地址,Port端口。

DatagramPacket(byte[] buf, int offset, int length):将数据包中从Offset开始、Length长的数据装进Buf数组。

DatagramPacket(byte[] buf, int length):将数据包中Length长的数据装进Buf数组。

DatagramPacket类最重要的方法就是getData()了,它从实例中取得报文的Byte数组编码。

TCP是面向连接,UDP面向非连接,资料不复制,在这里简单说下:\x0d\TCP建立连接时需要传说的三次握手,服务端与客户端需要确认对方身份而已,建立好连接后,就开始传递消息,直到有一方断开连接位置。 就好比两个人打电话,要先通了才能说话。\x0d\UDP只是数据报发送,它的优点速度快,并非要向TCP那样麻烦建立,它只负责将信息发出,但是并不确保信息的准确完整性等,就好比发短信,短信是出去了,但是中间是否有问题,是否对方手机能收到就不管了。\x0d\在java中想要实现上述两种协议通信,可采用socket建立连接,socket可以理解为码头,其实是套接字,这里简单说下,就好比两个城市运输货物,通过码头走货一样。至于如何通过socket建立两个连接,网上资料多的是,在这里不复制例子了。

Java UDP通信简单实现

1、Java实现方式

1)server端

/

  UDPserver端

  /

public class UdpServer {

    // 定义一些常量

    private final intMAX_LENGTH = 1024; // 最大接收字节长度

    private final intPORT_NUM   = 5066;   // port号

    // 用以存放接收数据的字节数组

    private byte[] receMsgs = new byte[MAX_LENGTH];

    // 数据报套接字

    private DatagramSocket datagramSocket;

    // 用以接收数据报

    private DatagramPacket datagramPacket;

   

    public UdpServer(){

        try {

            / 接收数据流程/

            // 创建一个数据报套接字,并将其绑定到指定port上

            datagramSocket = new DatagramSocket(PORT_NUM);

            // DatagramPacket(byte buf[], int length),建立一个字节数组来接收UDP包

            datagramPacket = new DatagramPacket(receMsgs, receMsgslength);

            // receive()来等待接收UDP数据报

            datagramSocketreceive(datagramPacket);

           

            / 解析数据报/

            String receStr = new String(datagramPacketgetData(), 0 , datagramPacketgetLength());

            Systemoutprintln("Server Rece:" + receStr);

            Systemoutprintln("Server Port:" + datagramPacketgetPort());

           

            / 返回ACK消息数据报/

            // 组装数据报

            byte[] buf = "I receive the message"getBytes();

            DatagramPacket sendPacket = new DatagramPacket(buf, buflength, datagramPacketgetAddress(), datagramPacketgetPort());

            // 发送消息

            datagramSocketsend(sendPacket);

        } catch (SocketException e) {

            eprintStackTrace();

        } catch (IOException e) {

            eprintStackTrace();

        } finally {

            // 关闭socket

            if (datagramSocket != null) {

                datagramSocketclose();

            }

        }

    }

}

2)client

/

  UDPclientClient端

 /

public class UdpClient {

   

    private String sendStr = "SendString";

    private String netAddress = "127001";

    private final intPORT_NUM = 5066;

   

    private DatagramSocket datagramSocket;

    private DatagramPacket datagramPacket;

   

    public UdpClient(){

        try {

           

            / 发送数据/

            // 初始化datagramSocket,注意与前面Server端实现的差别

            datagramSocket = new DatagramSocket();

            // 使用DatagramPacket(byte buf[], int length, InetAddress address, int port)函数组装发送UDP数据报

            byte[] buf = sendStrgetBytes();

            InetAddress address = InetAddressgetByName(netAddress);

            datagramPacket = new DatagramPacket(buf, buflength, address, PORT_NUM);

            // 发送数据

            datagramSocketsend(datagramPacket);

           

            / 接收数据/

            byte[] receBuf = new byte[1024];

            DatagramPacket recePacket = new DatagramPacket(receBuf, receBuflength);

            datagramSocketreceive(recePacket);

           

            String receStr = new String(recePacketgetData(), 0 , recePacketgetLength());

            Systemoutprintln("Client Rece Ack:" + receStr);

            Systemoutprintln(recePacketgetPort());

           

           

        } catch (SocketException e) {

            eprintStackTrace();

        } catch (UnknownHostException e) {

            eprintStackTrace();

        } catch (IOException e) {

            eprintStackTrace();

        } finally {

            // 关闭socket

            if(datagramSocket != null){

                datagramSocketclose();

            }

        }

    }  

}

可以在java中使用>

1端口占用编译器会报错,可以从错误看出来是不是端口被占用。没有专门的检测工具和方法

2DatagramSocket(在Java中使用UDP协议编程的相关类)

用于接收和发送UDP的Socket实例。该类有3个构造函数:

DatagramSocket():通常用于客户端编程,它并没有特定监听的端口,仅仅使用一个临时的。程序会让 *** 作系统分配一个可用的端口。

DatagramSocket(int port):创建实例,并固定监听Port端口的报文。通常用于服务端

DatagramSocket(int port, InetAddress localAddr):这是个非常有用的构建器,当一台机器拥有多于一个IP地址的时候,由它创建的实例仅仅接收来自LocalAddr的报文。

DatagramSocket具有的主要方法如下:

1)receive(DatagramPacket d):接收数据报文到d中。receive方法产生一个“阻塞”。“阻塞”是一个专业名词,它会产生一个内部循环,使程序暂停在这个地方,直到一个条件触发。

 2)send(DatagramPacket dp):发送报文dp到目的地。

 3)setSoTimeout(int timeout):设置超时时间,单位为毫秒。

 4)close():关闭DatagramSocket。在应用程序退出的时候,通常会主动释放资源,关闭Socket,但是由于异常地退出可能造成资源无法回收。所以,应该在程序完成时,主动使用此方法关闭Socket,或在捕获到异常抛出后关闭Socket。

希望对您有帮助谢谢

以上就是关于JAVA问题 UDP协议中的端口问题全部的内容,包括:JAVA问题 UDP协议中的端口问题、TCP和UDP通信有什么区别 如何分别用java实现、Java写的一个udp的demo用来计算探针传送过来的数据,怎么实现一个接口来调用这个数据等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/9276728.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-26
下一篇 2023-04-26

发表评论

登录后才能评论

评论列表(0条)

保存