Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么不同的DatagramSocket构造函数的行为如此不同?(例外情况)_Java_Sockets_Exception_Bind_Datagram - Fatal编程技术网

Java 为什么不同的DatagramSocket构造函数的行为如此不同?(例外情况)

Java 为什么不同的DatagramSocket构造函数的行为如此不同?(例外情况),java,sockets,exception,bind,datagram,Java,Sockets,Exception,Bind,Datagram,我正在构建一个程序,通过DatagramSocket和DatagramPack将局域网中的每台计算机连接到我的计算机(换句话说,我将是服务器,其他将是客户端)。我做了一些研究并阅读了文档,了解了它是如何工作的,我实际上已经能够通过网络发送和接收数据。我在客户机类中有两个数据发送方法的选项,我认为它们是等效的,但似乎不是。 第一个(客户1): 第二个(客户2): 这两个选项是在我测试向我自己的电脑发送数据和从我自己的电脑发送数据时出现的。我的IP地址是192.168.0.26。对于第一个,我没有问

我正在构建一个程序,通过DatagramSocket和DatagramPack将局域网中的每台计算机连接到我的计算机(换句话说,我将是服务器,其他将是客户端)。我做了一些研究并阅读了文档,了解了它是如何工作的,我实际上已经能够通过网络发送和接收数据。我在客户机类中有两个数据发送方法的选项,我认为它们是等效的,但似乎不是。 第一个(客户1):

第二个(客户2):

这两个选项是在我测试向我自己的电脑发送数据和从我自己的电脑发送数据时出现的。我的IP地址是192.168.0.26。对于第一个,我没有问题,但是第二个抛出两种异常。我可以验证Client1是否能够在运行计算机中的下一个代码的同时工作

(服务器)

如果我先运行服务器,然后运行Client1选项,它实际上会接收数据。当我先运行Client1,然后运行服务器时,显然不会得到任何数据,但也不会得到任何异常。真正的问题(和真正的问题,抱歉这么多,也许是无用的信息)是与Client2。如果这是在服务器之前运行的,则会得到NullPointerException:

java.lang.NullPointerException: null address || null buffer
at java.net.DualStackPlainDatagramSocketImpl.send(DualStackPlainDatagramSocketImpl.java:115)
at java.net.DatagramSocket.send(DatagramSocket.java:676)
java.net.BindException: Address already in use: Cannot bind
at java.net.DualStackPlainDatagramSocketImpl.socketBind(Native Method)
at java.net.DualStackPlainDatagramSocketImpl.bind0(DualStackPlainDatagramSocketImpl.java:65)
at java.net.AbstractPlainDatagramSocketImpl.bind(AbstractPlainDatagramSocketImpl.java:95)
at java.net.DatagramSocket.bind(DatagramSocket.java:376)
at java.net.DatagramSocket.<init>(DatagramSocket.java:231)
at java.net.DatagramSocket.<init>(DatagramSocket.java:284)
调用方法send()时生成。我知道也许我应该忽略这一点;尽管我对Socket有点生疏,但如果你知道没有人会收到数据,那么发送数据似乎是错误的。另一方面,当服务器先运行,然后运行Client2时,我得到BindException:

java.lang.NullPointerException: null address || null buffer
at java.net.DualStackPlainDatagramSocketImpl.send(DualStackPlainDatagramSocketImpl.java:115)
at java.net.DatagramSocket.send(DatagramSocket.java:676)
java.net.BindException: Address already in use: Cannot bind
at java.net.DualStackPlainDatagramSocketImpl.socketBind(Native Method)
at java.net.DualStackPlainDatagramSocketImpl.bind0(DualStackPlainDatagramSocketImpl.java:65)
at java.net.AbstractPlainDatagramSocketImpl.bind(AbstractPlainDatagramSocketImpl.java:95)
at java.net.DatagramSocket.bind(DatagramSocket.java:376)
at java.net.DatagramSocket.<init>(DatagramSocket.java:231)
at java.net.DatagramSocket.<init>(DatagramSocket.java:284)
java.net.BindException:地址已在使用中:无法绑定
位于java.net.DualStackPlainDatagramSocketImpl.socketBind(本机方法)
位于java.net.DualStackPlainDatagramSocketImpl.bind0(DualStackPlainDatagramSocketImpl.java:65)
位于java.net.AbstractPlainDatagramSocketImpl.bind(AbstractPlainDatagramSocketImpl.java:95)
位于java.net.DatagramSocket.bind(DatagramSocket.java:376)
在java.net.DatagramSocket(DatagramSocket.java:231)
在java.net.DatagramSocket(DatagramSocket.java:284)
从套接字初始化时的行开始。
由于Client1可以工作,我将使用它;但我真的很想知道为什么它能工作,而Client2却不能。我在这里的另一个论坛上读到了关于BindException的文章,我知道这是因为您试图使用一个已经在使用的端口,但从这个意义上说,Client1也应该失败。有人能给我解释一下Client1和Client2之间的区别吗?

您绑定到同一个端口,如果您在同一台机器/地址上运行它,您需要绑定到不同的端口

与服务器上的类似:

socket = new DatagramSocket(325);    //server binds its UDP/IP socket to port 325
在客户端2上:

socket = new DatagramSocket(325, InetAddress.getByName("192.168.0.26"));
您正在绑定到“服务器”使用的同一台机器/地址上的同一端口

在客户端1上:

packet = new DatagramPacket(data, data.length, InetAddress.getByName("192.168.0.26"), 325);
//you are specifying the destination address and port the packet should be sent.
socket = new DatagramSocket();
//but in the DatagramSocket contructor you don't pass any address or port to bind to, so it will use an available port, not 325 as it is in use by the server.
正如您所说的,您刚刚接触网络通信,请记住,这是UDP/IP套接字,还有TCP/IP等。UDP/IP不按规范面向连接,也不保证数据包的传输

packet = new DatagramPacket(data, data.length, InetAddress.getByName("192.168.0.26"), 325);
//you are specifying the destination address and port the packet should be sent.
socket = new DatagramSocket();
//but in the DatagramSocket contructor you don't pass any address or port to bind to, so it will use an available port, not 325 as it is in use by the server.