分享
  1. 首页
  2. 文章

golang--类似mochiweb的多进程监听tcp链接

getong · · 5073 次点击 · · 开始浏览
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

用Erlang开发web,很可能就会使用到mochiweb。mochiweb使用16个Erlang式的进程来监听tcp链接,使得任何链接进来都会很快得到处理。Golang跟Erlang很像,在这里实现了一个类似mochiweb的tcp监控链接,一个简单的echo服务器。先看代码。

 1 package main
 2 
 3 import (
 4 "log"
 5 "runtime"
 6 "net"
 7 )
 8 
 9 func main() {
10 
11 tcpAddr, err := net.ResolveTCPAddr("tcp", ":9988")
12  check_error(err)
13 tcpListener, err := net.ListenTCP("tcp", tcpAddr)
14  check_error(err)
15 for i := 0; i < 100; i++ {
16  go handle_tcp_accept(tcpListener)
17  }
18 
19 select {}
20 }
21 
22 
23 
24 func handle_tcp_accept(tcpListener *net.TCPListener) {
25 for {
26 tcpConn, err := tcpListener.AcceptTCP()
27 if err != nil {
28 log.Println("tcp accept failed!")
29 continue
30 } else {
31 connChan := make(chan []byte)
32  go write_tcp_conn(tcpConn, connChan)
33  go read_tcp_conn(tcpConn, connChan)
34  }
35  }
36 
37 }
38 
39 
40 func read_tcp_conn(tcpConn *net.TCPConn, connChan chan []byte) {
41 buffer := make([]byte, 2048)
42 tcpConn.SetReadBuffer(2048)
43 for {
44 n, err := tcpConn.Read(buffer[0:])
45 if err != nil {
46 log.Println("one tcp connection read function failed!")
47 log.Println("one tcp connection close now!")
48  tcpConn.Close()
49  runtime.Goexit()
50 } else {
51 connChan <- buffer[0 : n-1]
52  }
53  }
54 }
55 
56 func write_tcp_conn(tcpConn *net.TCPConn, connChan chan []byte) {
57 for {
58 msg := <-connChan
59 log.Println(string(msg))
60 tcpConn.Write([]byte(msg)[0 : len(msg)+1])
61  }
62 }
63 
64 
65 
66 
67 func check_error(err error) {
68 if err != nil {
69 log.Printf("Fatal error : %s", err.Error())
70  }
71 
72 }

上面代码保存为multi_thread_echo.go, 使用gotool编译

go build multi_thread_echo.go

上面代码使用了100个goroutine来监听TCP链接,每个链接进来,都会新建2个goroutine,一个read,一个write。下面看看效果图:

参考:

1.Golang Away: TCP Chat Server

http://www.badgerr.co.uk/2011/06/20/golang-away-tcp-chat-server/

2.Network programming with Go

http://jan.newmarch.name/go/

转贴请注明来自:格通


有疑问加站长微信联系(非本文作者)

本文来自:博客园

感谢作者:getong

查看原文:golang--类似mochiweb的多进程监听tcp链接

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

关注微信
5073 次点击
暂无回复
添加一条新回复 (您需要 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传

用户登录

没有账号?注册
(追記) (追記ここまで)

今日阅读排行

    加载中
(追記) (追記ここまで)

一周阅读排行

    加载中

关注我

  • 扫码关注领全套学习资料 关注微信公众号
  • 加入 QQ 群:
    • 192706294(已满)
    • 731990104(已满)
    • 798786647(已满)
    • 729884609(已满)
    • 977810755(已满)
    • 815126783(已满)
    • 812540095(已满)
    • 1006366459(已满)
    • 692541889

  • 关注微信公众号
  • 加入微信群:liuxiaoyan-s,备注入群
  • 也欢迎加入知识星球 Go粉丝们(免费)

给该专栏投稿 写篇新文章

每篇文章有总共有 5 次投稿机会

收入到我管理的专栏 新建专栏