Golang中无法监听并服务在8080端口的问题如何解决

Golang中无法监听并服务在8080端口的问题如何解决 我所有涉及Web应用和路由的程序都无法正常运行了。发现这个问题与端口有关。 https://play.golang.org/p/30xNbkdhoaa

以下是我在IDE中运行时遇到的错误:

2019/10/06 14:12:22 listen tcp :8080: bind: Only one usage of each socket address (protocol/network address/port) is normally permitted.
panic: listen tcp :8080: bind: Only one usage of each socket address (protocol/network address/port) is normally permitted.

真的不知道是什么原因导致的


更多关于Golang中无法监听并服务在8080端口的问题如何解决的实战教程也可以访问 https://www.itying.com/category-94-b0.html

4 回复

该命令在 Windows 终端中可用,但在 bash 终端中无法使用。

更多关于Golang中无法监听并服务在8080端口的问题如何解决的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


有另一个程序正在运行并绑定了该端口。

请先结束该程序或使用其他端口。

在 Linux 系统上,你可以通过 netstat -lnpt 命令查看哪些程序绑定了哪些端口。

func main() {
    fmt.Println("hello world")
}

由于某些原因,Windows 的命令无法正常工作。
以下是我在搜索该端口上运行的程序时得到的结果:

netstat -ano | findstr 8080
TCP    0.0.0.0:8080           0.0.0.0:0              LISTENING       19816
TCP    [::]:8080              [::]:0                 LISTENING       19816

这应该是结束它的命令:taskkill /F /PID 19816

但出现了无效参数错误。我会继续寻找其他方法来终止它。

这个错误表明8080端口已被占用,导致你的Go程序无法绑定到该端口。以下是几种解决方法:

方法1:检查并终止占用端口的进程

// 首先检查哪个进程占用了8080端口
// Windows:
// netstat -ano | findstr :8080

// Linux/Mac:
// lsof -i :8080 或 netstat -tulpn | grep :8080

找到PID后,终止相应进程:

// Windows:
// taskkill /PID <PID> /F

// Linux/Mac:
// kill -9 <PID>

方法2:修改程序使用其他端口

package main

import (
    "fmt"
    "log"
    "net/http"
)

func main() {
    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        fmt.Fprintf(w, "Hello, World!")
    })

    // 尝试使用8081端口
    port := ":8081"
    log.Printf("Server starting on port %s", port)
    if err := http.ListenAndServe(port, nil); err != nil {
        log.Fatalf("Failed to start server: %v", err)
    }
}

方法3:实现端口重试机制

package main

import (
    "fmt"
    "log"
    "net/http"
    "time"
)

func startServer(port string) error {
    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        fmt.Fprintf(w, "Server running on port %s", port)
    })
    return http.ListenAndServe(port, nil)
}

func main() {
    ports := []string{":8080", ":8081", ":8082", ":8083"}
    
    for _, port := range ports {
        log.Printf("Trying to start server on port %s", port)
        if err := startServer(port); err != nil {
            log.Printf("Port %s is busy: %v", port, err)
            time.Sleep(1 * time.Second)
            continue
        }
        break
    }
}

方法4:使用环境变量配置端口

package main

import (
    "fmt"
    "log"
    "net/http"
    "os"
)

func main() {
    port := os.Getenv("PORT")
    if port == "" {
        port = "8080" // 默认端口
    }
    
    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        fmt.Fprintf(w, "Server running on port %s", port)
    })
    
    addr := ":" + port
    log.Printf("Starting server on %s", addr)
    log.Fatal(http.ListenAndServe(addr, nil))
}

运行前设置环境变量:

export PORT=8081
go run main.go

方法5:检查程序是否已在运行

确保没有重复启动同一个程序:

package main

import (
    "fmt"
    "log"
    "net"
    "net/http"
    "time"
)

func isPortInUse(port string) bool {
    timeout := time.Second
    conn, err := net.DialTimeout("tcp", net.JoinHostPort("", port), timeout)
    if err != nil {
        return false
    }
    if conn != nil {
        conn.Close()
        return true
    }
    return false
}

func main() {
    port := ":8080"
    
    if isPortInUse(port) {
        log.Fatal("Port 8080 is already in use. Please stop the existing server first.")
    }
    
    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        fmt.Fprintf(w, "Server is running!")
    })
    
    log.Fatal(http.ListenAndServe(port, nil))
}

最常见的原因是已有其他进程(可能是之前未正确关闭的Go程序或其他应用)占用了8080端口。建议先使用方法1检查并清理占用端口的进程,然后重新运行你的程序。

回到顶部