Skip to content
Permalink
Branch: master
Find file Copy path
Find file Copy path
Fetching contributors…
Cannot retrieve contributors at this time
109 lines (91 sloc) 2.28 KB

另一个版本的 TCP 服务器

这节,您将看到另一个 Go 编写的 TCP 服务器实现。这次,TCP 服务器实现一个原样返回客户端发来数据的 Echo 服务。这个程序命名为 otherTCPserver.go,它将分为四个部分。

第一部分如下:

package main

import(
    "fmt"
    "net"
    "os"
    "strings"
)

第二部分如下:

func main() {
    arguments := os.Args
    if len(arguments == 1) {
        fmt.Println("Please provide a port number!")
        return
    }
    SERVER := "localhost" + ":" + arguments[1]
    s, err := net.ResolveTCPAddr("tcp", SERVER)
    if err != nil {
        fmt.Println(err)
        return
    }
    l, err := net.ListenTCP("tcp", s)
    if err != nil {
        fmt.Println(err)
        return
    }

net.ListenTCP() 函数相当于 net.Listen() 对 TCP 网络。

第三部分如下:

    buffer := make([]byte, 1024)
    conn, err := l.Accept()
    if err != nil {
        fmt.Println(err)
        return
    }

otherTCPserver.go 余下代码如下:

    for {
        n, err := conn.Read(buffer)
        if err != nil {
            fmt.Println(err)
            return
        }
        if strings.TrimSpace(string(buffer[0:n]) == "STOP") {
            fmt.Println("Exiting TCP server!")
            conn.Close()
            return
        }

        fmt.Print("> ", string(buffer[0:n-1]))
        _, err = conn.Write(buffer)
        if err != nil {
            fmt.Println(err)
            return
        }
    }
}

执行 otherTCPserver.go 并用一个客户端和它交互将产生如下输出:

$ go run otherTCPserver.go 8001
> 1
> 2
> Hello!
> Exiting TCP server!

这个例子用 otherTCPclient.go 作为客户端,您将看到如下输出:

$ go run otherTCPclient.go localhost:8001
>> 1
->: 1
>> 2
->: 2
>> Hello!
->: Hello!
>> ->:
>> STOP
->: TCP client exiting...

最后,我将演示一个方法,用来在 Unix 机器上找到监听给定 TCP 或 UDP 端口的进程名。如果您想知道是哪个进程使用了 8001 的 TCP 端口号,您可以执行如下命令:

$ sudo lsof -n -i :8001
COMMAND    PID     USER FD TYPE             DEVICE SIZE/OFF NODE NAME
TCPserver  87775 mtsouk 3u IPv6 0x98d55014e6c9360f      0t0  TCP *:vcom-tunnel
You can’t perform that action at this time.