golang代码片段(摘抄)
以下是从golang并发编程实战2中摘抄过来的代码片段,主要是实现一个简单的tcp socket通讯(客户端发送一个数字,服务端计算该数字的立方根然后返回),写的不错,用到了go的并发以及看下郝林大神是如何处理socket通讯的。具体代码记录如下,多看多学习多共勉:
package main import (
"net"
"strings"
"fmt"
"time"
"io"
"bytes"
"strconv"
"math"
"math/rand"
"sync"
)
const (
SERVER_NETWORK = "tcp"
SERVER_ADDRESS = "127.0.0.1:8085"
DELIMITER = '\t'
) var wg sync.WaitGroup func main() {
wg.Add(2)
go serverGo()
time.Sleep(500 * time.Millisecond)
go clientGo(1)
wg.Wait()
} func serverGo() {
defer wg.Done()
listener, err := net.Listen(SERVER_NETWORK, SERVER_ADDRESS)
if err != nil {
printServerLog("Listen Error: %s", err)
return
}
defer listener.Close()
printServerLog("Got listener for the server.(local address: %s)", listener.Addr())
for {
conn, err := listener.Accept()
if err != nil {
printServerLog("Accept Error: %s", err)
}
printServerLog("Established a connection with a client application,(remote address: %s)", conn.RemoteAddr())
go handleConn(conn)
}
} func printLog(role string, sn int, format string, args ...interface{}) {
if !strings.HasSuffix(format, "\n") {
format += "\n"
}
fmt.Printf("%s[%d]: %s", role, sn, fmt.Sprintf(format, args...))
} func printServerLog(format string, args ...interface{}) {
printLog("Server", 0, format, args...)
} func printClientLog(sn int, format string, args ...interface{}) {
printLog("Cient", sn, format, args...)
} func handleConn(conn net.Conn) {
defer conn.Close()
for {
conn.SetDeadline(time.Now().Add(10 * time.Second)) // set read timeline 10s
strReq, err := read(conn)
if err != nil {
if err == io.EOF {
printServerLog("The connection is closed by another side.")
} else {
printServerLog("Read Error: %s", err)
}
break
}
printServerLog("Received request: %s", strReq)
intReq, err := strToInt32(strReq)
if err != nil {
n, err := write(conn, err.Error())
printServerLog("Sent error message (written %d bytes): %s", n, err)
continue
}
floatResp := cbrt(intReq)
respMsg := fmt.Sprintf("The cube root of %d is %f.", intReq, floatResp)
n, err := write(conn, respMsg)
if err != nil {
printServerLog("Sent response message (written %d bytes: %s).", n, respMsg)
}
}
} func read(conn net.Conn) (string, error){
readBytes := make([]byte, 1)
var buffer bytes.Buffer
for {
_, err := conn.Read(readBytes)
if err != nil {
return "", err
}
readByte := readBytes[0]
if readByte == DELIMITER {
break
}
buffer.WriteByte(readByte)
}
return buffer.String(), nil
} func strToInt32(str string) (int32, error){
i32, err := strconv.ParseInt(str, 10 ,32)
return int32(i32), err
} func write(conn net.Conn, content string) (int, error) {
var buffer bytes.Buffer
buffer.WriteString(content)
buffer.WriteByte(DELIMITER)
return conn.Write(buffer.Bytes())
} func cbrt(intReq int32) float64 {
return math.Cbrt(float64(intReq))
} func clientGo(id int) {
defer wg.Done()
conn, err := net.DialTimeout(SERVER_NETWORK, SERVER_ADDRESS, 2 * time.Second)
if err != nil {
printClientLog(id, "Dial Error: %s", err)
return
}
defer conn.Close()
printClientLog(id, "Connected to server.(remote address: %s,local address: %s)", conn.RemoteAddr(), conn.LocalAddr())
time.Sleep(200 * time.Millisecond) requestNumber := 5
conn.SetDeadline(time.Now().Add(5 * time.Millisecond))
for i := 0; i< requestNumber; i++ {
req := rand.Int31()
n, err := write(conn, fmt.Sprintf("%d", req))
if err != nil {
printClientLog(id, "Write Error: %s", err)
continue
}
printClientLog(id, "Sent request (written %d bytes)", n)
}
for j := 0; j< requestNumber; j++ {
strResp, err := read(conn)
if err != nil {
if err == io.EOF {
printClientLog(id, "The connection is closed by another side.")
}else{
printClientLog(id, "Read Error: %s", err)
}
break
}
printClientLog(id, "Received response: %s", strResp)
}
}
执行效果:

golang代码片段(摘抄)的更多相关文章
- Golang, 以 9 个简短代码片段,弄懂 defer 的使用特点
作者:林冠宏 / 指尖下的幽灵 掘金:https://juejin.im/user/587f0dfe128fe100570ce2d8 博客:http://www.cnblogs.com/linguan ...
- sublimetext3中保存代码片段
在日常的开发工作中,不断重复上一次敲过的代码,有时确实感到伐木累."蓝瘦"(难受)."香菇"(想哭),大概表达的也是这样的心境吧!:grinning: 所以,在 ...
- Code Snippets 代码片段
Code Snippets 代码片段 1.Title : 代码片段的标题 2.Summary : 代码片段的描述文字 3.Platform : 可以使用代码片段的平台,有IOS/OS X/ ...
- 10个 jQuery 代码片段,可以帮你快速开发。
转载自:http://mp.weixin.qq.com/s/mMstI10vqwu8PvUwlLborw 1.返回顶部按钮 你可以利用 animate 和 scrollTop 来实现返回顶部的动画,而 ...
- 代码片段添加智能提示,打造一款人见人爱的ORM框架
SqlSugar ORM优点: 1.高性能,达到原生最高水准,比SqlHelper性能要高,比Dapper快30% 比EF快50% 2.支持多种数据库 ,sql版本更新最快,其它会定期更新,可以在多种 ...
- js/jquery/html前端开发常用到代码片段
1.IE条件注释 条件注释简介 IE中的条件注释(Conditional comments)对IE的版本和IE非IE有优秀的区分能力,是WEB设计中常用的hack方法.条件注释只能用于IE5以上,IE ...
- Visual Studio 如何使用代码片段Code Snippet提高编程速度!!!
使用Code Snippet简化Coding 在开发的项目的时候,你是否经常遇到需要重复编写一些类似的代码,比如是否经常会使用 for.foreach ? 在编写这两个循环语句的时候,你是一个字符 ...
- Visual Studio 的代码片段工具
当安装完Visual Studio之后,会有附带一些原生的代码片段文件(*.snippet),对于vs2013参考目录如下: X:\Program Files (x86)\Microsoft Visu ...
- sublime代码片段
创建方法:Tools > New Snippet 这时你会看到如下示例代码: <snippet> <content><![CDATA[ Hello, ${ ...
随机推荐
- 【OCP题库-12c】最新CUUG OCP 071考试题库(69题)
69.(31-1)choose the best answer: Evaluate the following query: SELECT INTERVAL '300' MONTH, INTERVAL ...
- 【OCP题库】最新CUUG OCP 12c 071考试题库(67题)
67.(25-8)choose the best answer: View the Exhibit and examine the structure of CUSTOMERS table. Eval ...
- 【微信小程序】——实战开发之和风(含demo)
微信小程序之和风 序 凑了一把微信小程序的热闹!12月,小程序正式发布,很火,但随之而来的是各种冷水,唱衰之调随处可见.但作为一个小前端,岂能有新技术却弃之不顾之理,更何况是微信出品的?抱着学习和研究 ...
- [转]iOS:批量导入图片和视频到模拟器的相册
IOS开发中我们经常会用到模拟器调试,模拟器有个主要的好处就是程序启动块,最重要的是如果没有证书的话,我们就只能在模拟器上调试了.使用模拟器调试时我们可能碰到需要从系统相册选择图片的情况,特别是做图片 ...
- 3.2 Multi-Master Replication
摘要: 出处:黑洞中的奇点 的博客 http://www.cnblogs.com/kelvin19840813/ 您的支持是对博主最大的鼓励,感谢您的认真阅读.本文版权归作者所有,欢迎转载,但请保留该 ...
- C#-MVC基础-模型(Model)、视图(View)和控制器(Controller)
搜狗百科:http://baike.sogou.com/v25227.htm?fromTitle=MVC MVC全名是Model View Controller,是软件工程中的一种软件架构模式,把软件 ...
- L08-Linux解决Device eth0 does not seem to be present,delaying initialization问题
问题前提: 在VirtualBox中克隆Linux服务器,如下,由Centos6.5_Base克隆得到node01服务器,采用的是完全克隆的方式,克隆时重新初始化MAC地址. 原服务器Centos6. ...
- [BZOJ 2894]世界线
传送门 \(\color{green}{solution}\) 在开这道题之前建议先看看3756:pty的字符串,然后你会发现这题就很zz了. 当然,作为一名合格的博主,我还是应该写点什么的 首先,我 ...
- dotnet publish
发布Release版本:dotnet publish --configuration Release 发布Debug版本:dotnet publish --configuration Debug
- 语言模型预训练方法(ELMo、GPT和BERT)——自然语言处理(NLP)
1. 引言 在介绍论文之前,我将先简单介绍一些相关背景知识.首先是语言模型(Language Model),语言模型简单来说就是一串词序列的概率分布.具体来说,语言模型的作用是为一个长度为m的文本确定 ...