越努力 越幸运

Go 语言 net 包使用记录

1. 基础概念

关于网络IPC(套接字)相关的知识点,可以参考相关《学习笔记》

在 Go 语言中,包 net 封装了关于网络套接字的所有接口。

对于服务端,使用 Listen 进行监听,使用 Accept 响应连接请求;

对于客户端,使用 Dial 进行服务连接请求,使用包 fmt 里的函数 Fprint 可以进行数据发送。

2. 使用示例

服务端程序 tcp-server.go 为:

package main

import (
	"bufio"
	"fmt"
	"log"
	"net"
	"strings"
)

func main() {
	fmt.Println("Launching server ...")

	// listen on all interfaces
	ln, err := net.Listen("tcp", ":8081")
	if err != nil {
		log.Fatal("listen tcp error")
	}

	// run loop forever or until ctrl-c
	for {
		// accept connection on port
		conn, err := ln.Accept()
		if err != nil {
			log.Fatal("accept tcp error")
		}

		// will listen for message to process ending in newline (\n)
		message, _ := bufio.NewReader(conn).ReadString('\n')

		// output message received
		fmt.Println("Message Received: ", string(message))

		// sample process for string received
		newmessage := strings.ToUpper(message)

		// sample process for string back to client
		conn.Write([]byte(newmessage + "\n"))
	}
}

客户端程序 tcp-client.go 为:

package main

import (
	"bufio"
	"fmt"
	"log"
	"net"
	"os"
)

func main() {
	// connect to this socket
	conn, err := net.Dial("tcp", "127.0.0.1:8081")
	if err != nil {
		log.Fatal("dial tcp error")
	}

	for {
		// read in input from stdin
		reader := bufio.NewReader(os.Stdin)
		fmt.Print("Text to send: ")
		text, err := reader.ReadString('\n')
		if err != nil {
			log.Fatal("read string error")
		}

		// send to socket
		fmt.Fprint(conn, text+"\n")

		// listen for replay
		message, err := bufio.NewReader(conn).ReadString('\n')
		if err != nil {
			log.Fatal("read string error")
		}

		fmt.Print("Message from server: " + message)
	}
}

首先运行 tcp-server 程序,再运行 tcp-client 程序。