先用golang实现一个简单的tcp服务端,假定文件名为clock1.go

// clock1.go
package main import (
"fmt"
"io"
"net"
"time"
) func handleConn(c net.Conn) {
defer c.Close()
for {
n, err := io.WriteString(c, time.Now().Format("15:04:05\n"))
fmt.Println(n)
if err != nil {
return
}
time.Sleep(1 * time.Second)
}
} func main() {
listen, err := net.Listen("tcp", "localhost:8080")
if err != nil {
fmt.Println(err)
}
for {
conn, err := listen.Accept()
if err != nil {
fmt.Println(err)
continue
}
handleConn(conn)
}
}

用下面命令编译运行

go build -o clock1
./clock1

在mac吧或者linux下运行

nc locahost 8080

nc是linux下的工具.相当于tcp的客户端.clock1收到请求后,会向客户端输出当前时间.

clock1虽然能显示当前时间,但是有一个问题.当一个nc locahost 8080在运行的过程中,再打开一个终端,再执行nc locahost 8080会卡住.clock1是一个单线程的输入端

,每次只处理一个客户端来的请求.下面的clock2用goroutinesq解决了这个问题.

//clock2.go
package main import (
"fmt"
"io"
"net"
"time"
) func handleConn(c net.Conn) {
defer c.Close()
for {
_, err := io.WriteString(c, time.Now().Format("15:04:05\n"))
if err != nil {
fmt.Printf("write error %v", err)
break
}
time.Sleep(1 * time.Second)
}
}
func main() {
listen, err := net.Listen("tcp", "localhost:8080")
if err != nil {
fmt.Println(err)
return
}
for {
conn, err := listen.Accept()
if err != nil {
fmt.Println(err)
continue
}
go handleConn(conn)
}
}

clock1.go和clock2.go的区别就是clock2.go的handleConn多了一个go,相当于启动一个新的协程.这里不深入讨论线程和协助的区别,只提一些最基本的内容.

首先线程是操作系统实现的,协程是在线程的基础上,golang自己实现的一个功能.对于程序员来说,可以简单的理解成线程和协程都是为了解决异步编程,线程由操作

系统实现,协程由编程语言实现.

最新文章

  1. Angular2入门系列教程3-多个组件,主从关系
  2. 耗时两月,NHibernate系列出炉
  3. Pyqt 获取动态生成的QLineEdit值
  4. Session Tracking Approaches
  5. 3.python算法之完全数
  6. 提示框alertmsg
  7. maven下载的jar文件出现invalid LOC header (bad signature)
  8. js对象2--工厂模式的由来--杂志
  9. Matlab中plot函数参数解析
  10. 转载Jquery中的三种$()
  11. android生成验证码bitmap
  12. 用JUNCTION映射文件夹内容 解决多系统跑同一个虚拟机而共享文件夹路径不同的问题
  13. hdu 3350
  14. C#开发学习——SqlHelper的应用
  15. Linux下Scala(2.12.1)安装
  16. 导入一个新项目需要注意的几大问题(jdk1.6+eclipse4.4+tomcat6)
  17. Ubuntu 搭建 GlusterFS 过程笔记
  18. MyDAL - 快速使用
  19. Exp1 PC平台逆向破解 20164302 王一帆
  20. DELL 服务器报CPU 1 has an internal error (IERR)

热门文章

  1. PHP 向数组头部插入数据
  2. a 标签添加 onclick 事件
  3. 从最近面试聊聊我所感受的.net天花板
  4. 星际争霸2 AI开发(持续更新)
  5. secureCRT安装与激活
  6. jQuery学习笔记3
  7. linux工作调度(计划任务)
  8. linux网络配置(ifcfg)
  9. 折腾笔记-计蒜客T1167AC记
  10. 2019牛客暑期多校训练营(第二场)J.Subarray