Golang中client-server模型
简易的client-server模型
客户端和服务端的交互过程
服务端
(1)监听端口返回listen: net.Listen()
(2)同意连接,得到conn: listen.Accept()
(3)处理连接: handleConn(conn)
客户端:
(1)发送建立连接请求:conn, err := net.Dial()
(2)处理连接,如往连接中写入数据
首先来开下服务端的程序
package main
import (
"bufio"
"fmt"
"log"
"net"
"strings"
"time"
)
func main() {
listener, err := net.Listen("tcp", "localhost:8000")
if err != nil {
log.Fatal(err)
}
for {
conn, err := listener.Accept()
if err != nil {
log.Print(err)
continue
}
// concurrence deal request, not parallel
go handleConn(conn)
}
}
func handleConn(c net.Conn) {
input := bufio.NewScanner(c)
// 等待客户端的输入,阻塞在此处,scan会按行读取
for input.Scan() {
//相比较netcat1,这里是并发打印的,打印先后顺序无法确定,goroutine还可以go
go echo(c, input.Text(), 1*time.Second) //在处理单个请求的实收也可以用并发
}
c.Close()
}
func echo(c net.Conn, shout string, delay time.Duration) {
fmt.Fprintln(c, "\t", strings.ToUpper(shout))
time.Sleep(delay)
fmt.Fprintln(c, "\t", shout)
time.Sleep(delay)
fmt.Fprintln(c, "\t", strings.ToLower(shout))
}
客户端的程序:
package main
import (
"io"
"log"
"net"
"os"
)
func main() {
conn, err := net.Dial("tcp", "localhost:8000")
if err != nil {
log.Fatal(err)
}
defer conn.Close()
go mustCopy(os.Stdout, conn) // 输出服务端返回的conn
mustCopy(conn, os.Stdin) //客户端写入conn
}
func mustCopy(dst io.Writer, src io.Reader) {
//io.Copy其实就是将src中的内容写入dst
if _, err := io.Copy(dst, src); err != nil {
log.Fatal(err)
}
}
相关文章
- Golang中匿名函数的使用
匿名函数在函数中抽象出来 对于一个项目,为了抽象,可以将一些功能相同的操作写成匿名,下面就是展示如何使用匿名函数: 匿名函数的价值: 在函数内部的匿名函数,共享函数的局部变量,其实这就是封装,类似于
- Golang中client-server模型
简易的client-server模型 客户端和服务端的交互过程 服务端 (1)监听端口返回listen: net.Listen() (2)同意连接,得到conn: listen.Accept() (
- 在Leaf中使用Protobuf
本文假定你已经仔细阅读过 TUTORIAL 一个简单的上手 在开始本范例之前,请确保已经获取了 Leaf 和 Leafserver 并且正确配置(否则请阅读 TUTORIAL 中相关内容)。 编写服务
随机推荐
- Golang中匿名函数的使用
匿名函数在函数中抽象出来 对于一个项目,为了抽象,可以将一些功能相同的操作写成匿名,下面就是展示如何使用匿名函数: 匿名函数的价值: 在函数内部的匿名函数,共享函数的局部变量,其实这就是封装,类似于
- Golang中client-server模型
简易的client-server模型 客户端和服务端的交互过程 服务端 (1)监听端口返回listen: net.Listen() (2)同意连接,得到conn: listen.Accept() (
- 在Leaf中使用Protobuf
本文假定你已经仔细阅读过 TUTORIAL 一个简单的上手 在开始本范例之前,请确保已经获取了 Leaf 和 Leafserver 并且正确配置(否则请阅读 TUTORIAL 中相关内容)。 编写服务