the starting socket error app already address python simplehttpserver

python - starting - socket error:[ errno 98 address already in use



socket.error:[Errno 48] Dirección ya en uso (6)

Por cierto, para evitar que esto suceda en primer lugar, simplemente presione Ctrl + C en la terminal mientras SimpleHTTPServer sigue funcionando normalmente. Esto detendrá "correctamente" el servidor y liberará el puerto para que no tenga que buscar y eliminar el proceso nuevamente antes de reiniciar el servidor.

(Mods: Intenté poner este comentario sobre la mejor respuesta donde pertenece, pero no tengo suficiente reputación).

Estoy intentando configurar un servidor con python desde el terminal mac.

Navego a la ubicación de la carpeta y uso:

python -m SimpleHTTPServer

Pero esto me da error:

socket.error: [Errno 48] Address already in use

Previamente había abierto una conexión usando el mismo comando para un sitio web diferente en una ubicación diferente en mi máquina.


Solución simple:

  1. Encuentre el proceso usando el puerto 8080 :

    sudo lsof -i:8080

  2. Mátalo:

    kill XXXX


Soy nuevo en Python, pero después de mi breve investigación, descubrí que esto es típico de que los enchufes estén enlazados. Sucede que el socket aún se está utilizando y es posible que deba esperar para usarlo. O bien, solo puede agregar:

tcpSocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

Esto debería hacer que el puerto esté disponible en un tiempo más corto. En mi caso, hizo que el puerto estuviera disponible casi de inmediato.


También puede servir en el siguiente puerto disponible más alto haciendo algo como esto en Python:

import SimpleHTTPServer import SocketServer Handler = SimpleHTTPServer.SimpleHTTPRequestHandler port = 8000 while True: try: httpd = SocketServer.TCPServer(('''', port), Handler) print ''Serving on port'', port httpd.serve_forever() except SocketServer.socket.error as exc: if exc.args[0] != 48: raise print ''Port'', port, ''already in use'' port += 1 else: break

Si necesita hacer lo mismo para otras utilidades, puede ser más conveniente como script bash:

#!/usr/bin/env bash MIN_PORT=${1:-1025} MAX_PORT=${2:-65535} (netstat -atn | awk ''{printf "%s/n%s/n", $4, $4}'' | grep -oE ''[0-9]*$''; seq "$MIN_PORT" "$MAX_PORT") | sort -R | head -n 1

Configura eso como un ejecutable con el nombre get-free-port y puedes hacer algo como esto:

someprogram --port=$(get-free-port)

Eso no es tan confiable como el enfoque nativo de Python porque el script bash no captura el puerto; otro proceso podría atrapar el puerto antes de que lo haga tu proceso (condición de carrera), pero aún puede ser lo suficientemente útil al usar una utilidad que no funciona. Tiene un enfoque propio de intentarlo de nuevo.


Use lsof -i: 5000 Esto le dará una lista de procesos usando el puerto, si corresponde. Una vez que se da la lista de procesos, use el ID en la columna PID para finalizar el proceso: por ejemplo, matar a 379


Ya tiene un proceso vinculado al puerto predeterminado (8000). Si ya ejecutó el mismo módulo anteriormente, lo más probable es que el proceso siga vinculado al puerto. Intenta localizar el otro proceso primero:

$ ps -fA | grep python 501 81651 12648 0 9:53PM ttys000 0:00.16 python -m SimpleHTTPServer

Los argumentos del comando están incluidos, por lo que puede detectar el que está ejecutando SimpleHTTPServer si hay más de un proceso de python activo. Es posible que desee probar si http://localhost:8000/ todavía muestra una lista de directorios para archivos locales.

El segundo número es el número del proceso; detener el servidor enviándole una señal:

kill 81651

Esto envía una señal SIGTERM estándar; si el proceso no responde, puede que tenga que recurrir a métodos más difíciles como enviar una señal SIGKILL ( kill -s KILL <pid> o kill -9 <pid> ). Ver Wikipedia para más detalles .

Alternativamente, ejecute el servidor en un puerto diferente , especificando el puerto alternativo en la línea de comando:

$ python -m SimpleHTTPServer 8910 Serving HTTP on 0.0.0.0 port 8910 ...

luego acceda al servidor como http://localhost:8910 ; donde 8910 puede ser cualquier número desde 1024 en adelante, siempre que el puerto no esté ocupado.