总感觉这段代码比较难并发处理

zhaohui_kevin · 2013-07-26 06:32:37 · 4913 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2013-07-26 06:32:37 的主题,其中的信息可能已经有所发展或是发生改变。

请各位看官提提意见 UDP Server的例子

package main

import (
    "fmt"
    "net"
    "os"
    "time"
)

func handleClient(conn *net.UDPConn) {
    var buf [512]byte

    n, addr, err := conn.ReadFromUDP(buf[0:])
    if err != nil {
        return
    }
    fmt.Println(string(buf[0:]))
    daytime := time.Now().String()
    fmt.Println(n, addr)
    conn.WriteToUDP([]byte(daytime), addr)

}

func checkError(err error) {
    if err != nil {
        fmt.Fprintf(os.Stderr, "Fatal error:%s", err.Error())
        os.Exit(1)
    }
}

func main() {
    service := ":1200"
    udpAddr, err := net.ResolveUDPAddr("up4", service)
    checkError(err)

    conn, err := net.ListenUDP("udp", udpAddr)
    checkError(err)

    for {
        handleClient(conn)
    }
}

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

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

4913 次点击  
加入收藏 微博
5 回复  |  直到 2013-08-01 07:22:30
Hubery
Hubery · #1 · 12年之前
for{
    go handleClient(conn)
}
Hubery
Hubery · #2 · 12年之前
for{
     conn,err := net.ListenUDP("udp",udpAddr)
     if err==nil{
       go handleClient(conn)
     }
}
zhaohui_kevin
zhaohui_kevin · #3 · 12年之前

@Hubery 这样的做法貌似是不对的,我换了另一种方式,把Handle函数里面的内容拆开了,我测试了一下,这样是比较合理的, 如

func handle(){
 xxxx
 go subhandle();

}

David
David · #4 · 12年之前

合并法没关系,几个小细节:

  1. 为什么你喜欢写buf[0:] 而不是buf[:smirk:

  2. ReadFromUDP 返回的 err 被你吞掉了,还不如给 log.Fatal 更好

  3. checkError 里面也建议用 log.Fatal

zhaohui_kevin
zhaohui_kevin · #5 · 12年之前
DavidDavid #4 回复

合并法没关系,几个小细节: 1. 为什么你喜欢写buf[0:] 而不是buf[:] 1. ReadFromUDP 返回的 err 被你吞掉了,还不如给 log.Fatal 更好 1. checkError 里面也建议用 log.Fatal

多谢David指点,我也是近期采用Go做项目,边学边做,很多不明地方请多指正啊。 顺带请教一下Go下面灵活输出Log的方法,如设定格式,以及输出到不同Log文件

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