如何使用http.ListenAndServe

时间:2017-04-15 10:12:27

标签: http go webserver port

我写了一个简单的网络服务器来监听端口8080.但我不想使用硬编码的端口号。我想要的是我的服务器监听任何可用的端口。我想知道我的网络服务器正在监听的端口号。

我的代码如下:

package main

import (
    "net/http"
)

func main() {       
    http.HandleFunc("/", handler)
    http.ListenAndServe(":8080", nil)

}

2 个答案:

答案 0 :(得分:39)

您可以使用端口0表示您没有指定确切的端口,但是您希望系统选择一个免费的可用端口:

http.ListenAndServe(":0", nil)

问题在于您将无法找到分配的端口。因此,您需要自己创建net.Listener(使用net.Listen()功能),然后手动将其传递给http.Serve()

listener, err := net.Listen("tcp", ":0")
if err != nil {
    panic(err)
}

fmt.Println("Using port:", listener.Addr().(*net.TCPAddr).Port)

panic(http.Serve(listener, nil))

示例输出:

Using port: 42039

如您所见,您可以从net.Listener地址(由Addr()方法获取)访问net.Addr指定的端口。 net.Listener并未直接授予对该端口的访问权限,但由于我们使用tcp网络流创建了net.Addr,因此Port int将为动态类型net.Addr(我们可以使用*net.TCPAddr获取,这是一个结构,并且有一个字段listener.Addr()

请注意,如果您不需要应用程序中的端口(例如,您只想自己显示它),则不需要类型断言,只需打印fmt.Println("Address:", listener.Addr()) (将包含最后的端口):

Address: [::]:42039

示例输出:

http.ListenAndServe()

另外不要忘记处理返回的错误(在这种情况下为panic())。在我的示例中,我只是将其传递给http.LitenAndServe(),因为如果一切顺利,http.Serve()panic()会阻止(因此只有在出现错误时才会返回,我会将其传递给#include <stdio.h> #include <stdlib.h> // using a structure typedef struct mynode { int data; struct mynode *prev; // to point to previous node struct mynode *link; // to point to next node } node; node *head = NULL; // creating the list void create() { node *p, *q; int ch; do { p = (node *)malloc(sizeof(node)); printf("enter data\n"); scanf("%d", &p->data); if (head == NULL) { p->prev = head; q = p; } else { p->prev = q; p->link = NULL; q->link = p; q = p; } printf("create another node?, press 1 "); scanf ("%d",&ch); } while(ch==1); } //to delete alternate elements void delete_Alt() { if (head == NULL) printf("Empty list...ERROR"); node *previous, *current, *next; previous = head; current = head->link; while (previous !=NULL && current != NULL) { previous->prev = current->prev; previous->link = current->link; next = current->link; previous->link = next; next->prev = previous; free(current); } } // print the list void display() { node *temp; temp = head; while (temp != NULL) { printf("%d ",temp->data); temp = temp->link; } printf("\n"); } int main() { node *head = NULL; create(); printf("List before deleting is: "); display(); delete_Alt(); printf("List after deleting is: "); display(); return 0; }

答案 1 :(得分:3)

我登陆此页面是因为我想在随机端口上启动一个新服务器以进行测试。后来我了解到 httptesthttps://golang.org/pkg/net/http/httptest/ ,它在管理用于测试的临时 HTTP 服务器方面做得更好。