¿Por qué Windows Java no puede vincularse a un puerto que ya se ha vinculado?

Tenemos la necesidad de vincularnos al mismo puerto local al responder a las solicitudes. A continuación se muestra una muestra de código Java. En Linux podemos vincularnos al mismo puerto dos veces, pero en Windows obtenemos un error en el segundo enlace. El error es BindException: la dirección ya está en uso. Un programa similar escrito en C nos permite vincular dos veces. ¿Qué impide que Java en Windows haga esto? ¿Existe una configuración de registro para permitir el enlace?

import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.SocketAddress;

public class SocketTest 
{
    public static void main(String[] args) throws Exception
    {
        Socket s1 = new Socket();
        s1.setReuseAddress(true);
        SocketAddress saremote = new InetSocketAddress("google.com", 80);
        SocketAddress salocal = new InetSocketAddress("10.1.1.98", 9990);
        s1.bind(salocal);
        s1.connect(saremote);

        Socket s2 = new Socket();
        s2.setReuseAddress(true);
        SocketAddress saremote2 = new InetSocketAddress("yahoo.com", 80);
        SocketAddress salocal2 = new InetSocketAddress("10.1.1.98", 9990);
        s2.bind(salocal2);
        s2.connect(saremote2); 
    }
}
Respuesta 1

Use -Dsun.net.useExclusiveBind = false

Ha habido un cambio en la implementación de API de red en plataformas Windows. La implementación de las API de red se ha cambiado en Windows para usar la opción de socket SO_EXCLUSIVEADDRUSE de forma predeterminada. Este cambio es necesario para abordar las anomalías que surgen cuando se utilizan aplicaciones IPv4 e IPv6 que requieren vincularse al mismo puerto.

Este cambio puede causar problemas para las aplicaciones que dependen de la capacidad de tener múltiples procesos vinculados a la misma dirección y puerto. Cuando ocurran tales problemas, use la propiedad del sistema sun.net.useExclusiveBind como una solución temporal para restaurar el comportamiento heredado.

Respuesta: 2

Tengo un javax.xml.datatype.Duration que contiene una fracción de milisegundos, por ejemplo, una duración de 1.5ms (1500 microsegundos): Duración duración = DatatypeFactory.newInstance (). NewDuration ("PT0.0015S"); ...

Estoy trabajando con una consulta para traer datos de acuerdo a un momento dado. así que quiero tomar una marca de tiempo y eliminar los últimos 3 dígitos. ¿Es posible? ¿cómo? dame una pista, apreciaré totalmente que

Tengo un problema con la visualización de imágenes en el GridPane. Recibí un error de que el flujo de entrada no debe ser nulo. La excepción está en la primera fila del objeto de creación de ImageView. Como puedes ver las fotos están en ...

Tengo el siguiente código String [] helloWorld = {"Hola", "Mundo"}; System.out.println (Arrays.toString (helloWorld)); que imprime [Hola, Mundo] Necesito eliminar los espacios en blanco y []. Y obten ...