golang实现基于TCP协议的简单的C-S架构

七八个星天 · · 793 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

一、SERVER端

package main

import (
    "fmt"
    "net"
    "runtime"
    "strings"
)

func handleConn(conn net.Conn) {
    defer conn.Close()
    ip := conn.RemoteAddr()
    fmt.Println("客户端已连接---", ip)
    //读取客户端数据
    buf := make([]byte, 4096)
    for {
        n, err := conn.Read(buf)
        if n == 0 {
            fmt.Println("客户端断开连接")
            runtime.Goexit()
        }
        if err != nil {
            fmt.Println("conn.Read err:", err)
            return
        }
        if string(buf[:n])=="exit\n"||string(buf[:n])=="exit\r\n"{
            fmt.Println("客户端申请断开连接---",ip)
            fmt.Println("客户端已经断开连接---",ip)
            runtime.Goexit()
        }
        fmt.Print("已接收客户端输入:",string(buf[:n]))
        //将接收到的数据转换成大写,并发送给客户端
        conn.Write([]byte(strings.ToUpper(string(buf[:n]))))
    }
}
func main() {
    //创建服务
    listener, err := net.Listen("tcp", "127.0.0.1:8000")
    defer listener.Close()
    if err != nil {
        fmt.Println("net.Listen err:", err)
        return
    }
    //监听客户端请求
    for {
        conn, err := listener.Accept()
        if err != nil {
            fmt.Println("listener.Accept err:", err)
            return
        }
        go handleConn(conn)
    }
}

二、CLIENT端

package main

import (
    "fmt"
    "io"
    "net"
    "os"
)

func main() {
    //发送请求,获取连接
    conn,err:=net.Dial("tcp","127.0.0.1:8000")
    defer conn.Close()
    if err!=nil{
        fmt.Println("net.Dial err:",err)
        return
    }
    for{
        //输入数据并发送给服务器
        str :=make([]byte,4096)
        //读取键盘输入
        n,err := os.Stdin.Read(str)
        if err!=nil{
            fmt.Println("os.Stdin.Read err:",err)
        }
        conn.Write(str[:n])
        if n==0{
            continue
        }
        n,err = conn.Read(str)
        if err==io.EOF{
            fmt.Println("已断开与服务器的连接")
            return
        }
        if err!=nil{
            fmt.Println("os.Stdin.Read err:",err)
        }
        fmt.Print(string(str[:n]))
    }
}


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

本文来自:简书

感谢作者:七八个星天

查看原文:golang实现基于TCP协议的简单的C-S架构

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

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