GoLang 示例:并发回声服务器

我加入简书的路程 · · 954 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

服务器端

package main

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

func main() {
    listenner,err:=net.Listen("tcp","localhost:8000")
    if err != nil {
        log.Fatal(err)
    }
    for{
        conn,err:=listenner.Accept()
        if err != nil {
            log.Print(err)
            continue
        }
        handleConn(conn)
    }
}

func handleConn(c net.Conn){
    input := bufio.NewScanner(c)
    for input.Scan(){
        echo(c,input.Text(),1*time.Second)
    }
}
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)
    mustCopy(conn,os.Stdin)
    
}

func mustCopy(dst io.Writer, src io.Reader)  {
    if _,err:=io.Copy(dst,src);err!=nil {
        log.Fatal(err)
    }
}

工作原理

服务端向外提供以下服务
  • 开启一个tcp服务器listenner
  • tcp服务器监听请求产生连接conn ->for
  • 使用外部函数处理conn ->for
    外部处理函数工作流程
  • 使用NewScanner(conn)获取input
  • 循环执行echo()函数直到没有获取到新的input为止
客户端向服务端发送请求原理
  • 开启一个客户端的连接conn
  • 获取输入赋值给conn
    *在另一个goroutine 将处理后的结果输出到客户端

完成!


有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:我加入简书的路程

查看原文:GoLang 示例:并发回声服务器

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

954 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传