博客
关于我
高并发C/S的TCP版本golang实现
阅读量:267 次
发布时间:2019-03-01

本文共 986 字,大约阅读时间需要 3 分钟。

前面一篇文章写到的实现服务器只能连接一个客户端,没有发挥出go语言的协程特性,所以又可用如下方法实现高并发,多个客户端连接来完成:

package mainimport (	"fmt"	"net"	"strings")// 服务器Read读客户端,返回0 说明对端关闭func main() {   	// 创建监听套接字	listener, err := net.Listen("tcp", "127.0.0.1:8001")	if err != nil {   		fmt.Println("listen err", err)		return	}	defer listener.Close()	for {   		// 监听客户端连接请求		fmt.Println("服务器等待客户端连接")		conn, err := listener.Accept()		if err != nil {   			fmt.Println("listener.Accept err", err)			return		}		// 具体完成服务器和客户端的数据通信		go HandlerConnect(conn)	}}func HandlerConnect(conn net.Conn) {   	defer conn.Close()	// 获取连接的客户端Addr	addr := conn.RemoteAddr()	fmt.Println(addr, "客户端成功连接---")	// 循环读取客户端发送数据	buf := make([]byte, 4096)	for {   		n, err := conn.Read(buf)		if n == 0 {   			fmt.Println("服务器检测到客户端已关闭,断开连接")			// 这里关闭的只是go线程,main线程还是在for循环的			return		}		if err != nil {   			fmt.Println("conn Read err", err)			return		}		fmt.Println("服务器读到数据:", string(buf[:n]))		// 小写转大写回发		conn.Write([]byte(strings.ToUpper(string(buf[:n]))))	}}

转载地址:http://eqpv.baihongyu.com/

你可能感兴趣的文章
Mysql 事务知识点与优化建议
查看>>
Mysql 优化 or
查看>>
mysql 优化器 key_mysql – 选择*和查询优化器
查看>>
MySQL 优化:Explain 执行计划详解
查看>>
Mysql 会导致锁表的语法
查看>>
mysql 使用sql文件恢复数据库
查看>>
mysql 修改默认字符集为utf8
查看>>
Mysql 共享锁
查看>>
MySQL 内核深度优化
查看>>
mysql 内连接、自然连接、外连接的区别
查看>>
mysql 写入慢优化
查看>>
mysql 分组统计SQL语句
查看>>
Mysql 分页
查看>>
Mysql 分页语句 Limit原理
查看>>
MySql 创建函数 Error Code : 1418
查看>>
MySQL 创建新用户及授予权限的完整流程
查看>>
mysql 创建表,不能包含关键字values 以及 表id自增问题
查看>>
mysql 删除日志文件详解
查看>>
mysql 判断表字段是否存在,然后修改
查看>>
MySQL 到底能不能放到 Docker 里跑?
查看>>