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
该命令在 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检查并清理占用端口的进程,然后重新运行你的程序。

