Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/325.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.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 在udp套接字上设置源端口_Java_Sockets - Fatal编程技术网

Java 在udp套接字上设置源端口

Java 在udp套接字上设置源端口,java,sockets,Java,Sockets,我们开发了一个Java应用程序,它将几个UDP数据报发送到同一个目标IP地址。显然,目标端口总是相同的,但我们似乎无法将源端口设置为在每个数据报上保持不变 如果我们发送的数据包大于MTU,则该数据包将在同一源端口上正确分割,但一旦我们发送新的数据包,源端口将发生变化,从而生成新的防火墙会话(网络管理员已警告我们,由于应用程序生成的会话数量太多,该会话非常糟糕) 现在我们正在发送带有以下声明的包: 我们尝试了几种方法,结果总是一样的,我们似乎无法将源端口设置为固定值 编辑-粘贴实际代码: priv

我们开发了一个Java应用程序,它将几个UDP数据报发送到同一个目标IP地址。显然,目标端口总是相同的,但我们似乎无法将源端口设置为在每个数据报上保持不变
如果我们发送的数据包大于MTU,则该数据包将在同一源端口上正确分割,但一旦我们发送新的数据包,源端口将发生变化,从而生成新的防火墙会话(网络管理员已警告我们,由于应用程序生成的会话数量太多,该会话非常糟糕)

现在我们正在发送带有以下声明的包:

我们尝试了几种方法,结果总是一样的,我们似乎无法将源端口设置为固定值

编辑-粘贴实际代码:

private boolean sendImage(byte[] imageData, InetAddress address,
int port) throws UnknownHostException, SocketException {

    boolean ret = false;


    DatagramSocket socket = null;

    try {
        socket = new DatagramSocket();
        DatagramPacket dp = new DatagramPacket(imageData, imageData.length, address, PUERTO_UDP);
        socket.send(dp);
        ret = true;
    } catch (IOException e) {
        Main.lanzarExcepcion(e);
        ret = false;
    } finally {
        if (socket != null) {
             socket.close();
        }
    }

    return ret;
}

谢谢你的时间

源端口是一个临时端口,由底层网络实现为您生成。没有理由将其设置为特定的端口号。

我认为您的问题在于您正在关闭实际的
DatagramSocket
,而不是重复使用它,只需调用
socket.send(DatagramPack)
。如果无法保持客户端套接字打开,则甚至可以定义客户端端口,如:
datagramsocketclientsocket=newdatagramsocket(9743)
因此,每次调用新的clientSocket时,它都会获得相同的端口,或者抛出
java.net.BindException:地址已在使用中:无法绑定


这不会解决网络会话问题,因为您正在打开一个新的UDP套接字。我还怀疑您的网络管理员看到了前面的会话,因为您根本没有关闭UDP套接字,而是像@AntJavaDev提到的那样生成它们

解决办法是:

1.-保持DatagramSocket打开 2.-在参数中传递src端口 3.-将每个新数据包的未关闭DatagramSocket重新用于同一目的地


谢谢大家

事实上,我刚刚写给你的原因是,我们在防火墙资源的最大会话数为200万的情况下,每个客户端每15分钟消耗2万个会话。我们在一所拥有1700个可访问客户端的大学里,如果每个人都开始使用此软件,我们会让防火墙不稳定。@CarlosAlbaladejo您是否尝试过对许多UDP数据包使用相同的
InetSocketAddress
对象,而不是为每个UDP数据包创建一个新端口。?嗯,我假设端口在前一个UDP套接字未关闭时发生变化,因此操作系统正在尝试打开一个新连接,以便前一个端口尚不可用,并打开下一个可用端口。这是你的问题吗?因为我想不出任何其他改变客户端端口的原因。您还可以解释一下“但一旦我们发送了一个新的数据包,源端口就会改变”是什么意思吗?您如何尝试打开新连接?在同一条线上?在另一个过程中??你是如何关闭UDP套接字的?还有你对
DatagramPacket
类的初始化,看起来不太合适……甚至不确定是否编译了这个类以保持它始终不变的方式是始终从同一个套接字发送,而不是明显地为每个请求创建一个新的套接字。好的,问题就是我提到的,检查我的回答刚才尝试保持DatagramSocket对象打开并重复使用它,只是调用socket.send(dp)并注释掉socket.close()仍然相同的行为刚才尝试保持DatagramSocket对象打开并重复使用它,只是调用socket.send(dp)并注释掉socket.close()仍然相同的行为。对这种方法有一些希望,因为你不重新打开插座是有道理的?你也可以尝试定义端口吗?只是通过不关闭套接字和指定所需端口来实现,现在我得到了正确的src端口!好的,很酷。如果网络会话问题也得到了解决,您是否也可以发布?确认网络会话在15分钟内从每间教室30k减少到30:D