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])) //打印接收到的内容, 转换为字符串再打印
    	}
    }

    执行结果:

  • 相关阅读:
    解决:Could not resolve archetype org.apache.maven.archetypes
    Spring MVC配置MyBatis输出SQL
    Spring集成MyBatis 通用Mapper以及 pagehelper分页插件
    关于SpringMVC或Struts2接受参数接收不到的原因
    配置quartz启动时就执行一次
    ajaxFileUpload进行文件上传时,总是进入error
    spring mvc注入配置文件里的属性
    java中将一个文件夹下所有的文件压缩成一个文件
    flume failed to start agent because dependencies were not found in classpath
    ubuntu不能安装pip unable to install pip in unbuntu
  • 原文地址:https://www.cnblogs.com/nulige/p/10302268.html
Copyright © 2011-2022 走看看