zoukankan      html  css  js  c++  java
  • Go语言之进阶篇简单版并发服务器

    1、简单版并发服务器

    示例1:

    package main
    
    import (
    	"fmt"
    	"net"
    	"strings"
    )
    
    //处理用户请求
    func HandleConn(conn net.Conn) {
    	//函数调用完毕,自动关闭conn
    	defer conn.Close()
    
    	//获取客户端的网络地址信息
    	addr := conn.RemoteAddr().String()
    	fmt.Println(addr, " conncet sucessful")
    
    	buf := make([]byte, 2048)
    
    	for {
    		//读取用户数据
    		n, err := conn.Read(buf)
    		if err != nil {
    			fmt.Println("err = ", err)
    			return
    		}
    		fmt.Printf("[%s]: %s
    ", addr, string(buf[:n]))
    		fmt.Println("len = ", len(string(buf[:n])))
    
    		//if "exit" == string(buf[:n-1]) { //nc测试
    		if "exit" == string(buf[:n-2]) { //自己写的客户端测试, 发送时,多了2个字符, "
    "
    			fmt.Println(addr, " exit")
    			return
    		}
    
    		//把数据转换为大写,再给用户发送
    		conn.Write([]byte(strings.ToUpper(string(buf[:n]))))
    	}
    
    }
    
    func main() {
    	//监听
    	listener, err := net.Listen("tcp", "127.0.0.1:8000")
    	if err != nil {
    		fmt.Println("err = ", err)
    		return
    	}
    
    	defer listener.Close()
    
    	//接收多个用户
    	for {
    		conn, err := listener.Accept()
    		if err != nil {
    			fmt.Println("err = ", err)
    			return
    		}
    
    		//处理用户请求, 新建一个协程
    		go HandleConn(conn)
    	}
    
    }
    

    执行结果: 打开nc客户端:

    2、简单版并发服务器

    示例2:

    tcp_server.go

    package main
    
    import (
    	"fmt"
    	"net"
    	"strings"
    )
    
    //处理用户请求
    func HandleConn(conn net.Conn) {
    	//函数调用完毕,自动关闭conn
    	defer conn.Close()
    
    	//获取客户端的网络地址信息
    	addr := conn.RemoteAddr().String()
    	fmt.Println(addr, " conncet sucessful")
    
    	buf := make([]byte, 2048)
    
    	for {
    		//读取用户数据
    		n, err := conn.Read(buf)
    		if err != nil {
    			fmt.Println("err = ", err)
    			return
    		}
    		fmt.Printf("[%s]: %s
    ", addr, string(buf[:n]))
    		fmt.Println("len = ", len(string(buf[:n])))
    
    		//if "exit" == string(buf[:n-1]) { //nc测试
    		if "exit" == string(buf[:n-2]) { //自己写的客户端测试, 发送时,多了2个字符, "
    "
    			fmt.Println(addr, " exit")
    			return
    		}
    
    		//把数据转换为大写,再给用户发送
    		conn.Write([]byte(strings.ToUpper(string(buf[:n]))))
    	}
    
    }
    
    func main() {
    	//监听
    	listener, err := net.Listen("tcp", "127.0.0.1:8000")
    	if err != nil {
    		fmt.Println("err = ", err)
    		return
    	}
    
    	defer listener.Close()
    
    	//接收多个用户
    	for {
    		conn, err := listener.Accept()
    		if err != nil {
    			fmt.Println("err = ", err)
    			return
    		}
    
    		//处理用户请求, 新建一个协程
    		go HandleConn(conn)
    	}
    
    }
    

    tcp_client.go

    package main
    
    import (
    	"fmt"
    	"net"
    	"os"
    )
    
    func main() {
    	//主动连接服务器
    	conn, err := net.Dial("tcp", "127.0.0.1:8000")
    	if err != nil {
    		fmt.Println("net.Dial err = ", err)
    		return
    	}
    
    	//main调用完毕,关闭连接
    	defer conn.Close()
    
    	go func() {
    		//从键盘输入内容,给服务器发送内容
    		str := make([]byte, 1024)
    		for {
    			n, err := os.Stdin.Read(str) //从键盘读取内容, 放在str
    			if err != nil {
    				fmt.Println("os.Stdin. err = ", err)
    				return
    			}
    
    			//把输入的内容给服务器发送
    			conn.Write(str[:n])
    		}
    	}()
    
    	//接收服务器回复的数据
    	//切片缓冲
    	buf := make([]byte, 1024)
    	for {
    		n, err := conn.Read(buf) //接收服务器的请求
    		if err != nil {
    			fmt.Println("conn.Read err = ", err)
    			return
    		}
    		fmt.Println(string(buf[:n])) //打印接收到的内容, 转换为字符串再打印
    	}
    }

    执行结果:

  • 相关阅读:
    通过URL地址将图片保存到本地
    Sql批量提交方法
    MySql 批量提交方法
    【Sqlserver】查看所有数据库的大小 创建日期 名称 版本级别 状态
    【asp.net】滑块验证码(分享一个从github上下载的源码)
    【winform】 WeifenLuo.WinFormsUI.Docking.dll 组件学习
    【C#】初次使用webapi的体会
    【C#】 封装的异步HttpRequest
    Android实现双时间选择器
    Android的金额3位数加逗号分隔
  • 原文地址:https://www.cnblogs.com/nulige/p/10302268.html
Copyright © 2011-2022 走看看