UDP客户端和服务器使用数据包含来源以及目的地信息。客户端或服务器不会维护维护消息的状态。 无法保证消息能够到达,也无法保证按照顺序到达。
udp常见方法:
1 2 3 4 5
| func ResolveUDPAddr(net, addr string) (*UDPAddr, os.Error) func DialUDP(net string, laddr, raddr *UDPAddr) (c *UDPConn, err os.Error) func ListenUDP(net string, laddr *UDPAddr) (c *UDPConn, err os.Error) func (c *UDPConn) ReadFromUDP(b []byte) (n int, addr *UDPAddr, err os.Error func (c *UDPConn) WriteToUDP(b []byte, addr *UDPAddr) (n int, err os.Error)
|
udp客户端和tcp类似:
udp 客户端
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
|
package main
import ( "net" "os" "fmt" )
func main() { if len(os.Args) != 2 { fmt.Fprintf(os.Stderr, "Usage: %s host:port", os.Args[0]) os.Exit(1) } service := os.Args[1]
udpAddr, err := net.ResolveUDPAddr("udp4", service) checkError(err)
conn, err := net.DialUDP("udp", nil, udpAddr) checkError(err)
_, err = conn.Write([]byte("anything")) checkError(err)
var buf [512]byte n, err := conn.Read(buf[0:]) checkError(err)
fmt.Println(string(buf[0:n]))
os.Exit(0) }
func checkError(err error) { if err != nil { fmt.Fprintf(os.Stderr, "Fatal error %s", err.Error()) os.Exit(1) } }
|
udp服务器与tcp有较大不同:
udp 服务器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
|
package main
import ( "fmt" "net" "os" "time" )
func main() {
service := ":1200" udpAddr, err := net.ResolveUDPAddr("udp4", service) checkError(err)
conn, err := net.ListenUDP("udp", udpAddr) checkError(err)
for { handleClient(conn) } }
func handleClient(conn *net.UDPConn) {
var buf [512]byte
_, addr, err := conn.ReadFromUDP(buf[0:]) if err != nil { return }
daytime := time.Now().String()
conn.WriteToUDP([]byte(daytime), addr) conn.Close() }
func checkError(err error) { if err != nil { fmt.Fprintf(os.Stderr, "Fatal error %s", err.Error()) os.Exit(1) } }
|
灾难总是接踵而至,这正是世间的常理。你以为只要哭诉一下,就会有谁来救你?如果失败了,就只能说明我不过是如此程度的男人