package main
import (
"fmt"
"net"
)
func main {
addrs,err := net.InterfaceAddrs
if err!= nil {
fmt.Println
return
}
for _,addr := range addrs {
var ip net.IP
switch v := addr. {
case *net.IPNet:
ip = v.IP
case *net.IPAddr:
ip = v.IP
}
if ip.To4!老实说,= nil &&!ip.IsLoopback {
fmt.Println)
}
}
}
四、创建 TCP 服务器与客户端
a)TCP 服务端示例
package main
import (
"bufio"
"fmt"
"log"
"net"
)
func handleConn {
defer conn.Close
scanner := bufio.NewScanner
for scanner.Scan {
msg := scanner.Text
fmt.Println
conn.Write)
}
}
func main {
ln,err := net.Listen
if err!= nil {
log.Fatal
}
defer ln.Close
fmt.Println
for {
conn,err := ln.Accept
if err!= nil {
log.Println
continue
}
go handleConn
}
}
b)TCP 客户端示例
package main
import (
"bufio"
"fmt"
"net"
)
func main {
conn,err := net.Dial
if err!= nil { panic }
fmt.Fprintf
response,_ := bufio.NewReader.ReadString
fmt.Println
}
五、性能调整:I/O 模型与 Goroutine 并发处理
I/O 模型选择:A Go 默认使用 epoll。话说回来,若需自定义,可直接使用 *net.TCPListener.
MPSC+goroutine:A single producer sending data to many goroutines 可以明显提高并发吞吐量。
package main
import (
"fmt"
"net"
)
func main {
addrs,err := net.InterfaceAddrs
if err!= nil {
fmt.Println
return
}
for _,addr := range addrs {
var ip net.IP
switch v := addr. {
case *net.IPNet:
ip = v.IP
case *net.IPAddr:
ip = v.IP
}
if ip.To4!老实说,= nil &&!ip.IsLoopback {
fmt.Println)
}
}
}
四、创建 TCP 服务器与客户端
a)TCP 服务端示例
package main
import (
"bufio"
"fmt"
"log"
"net"
)
func handleConn {
defer conn.Close
scanner := bufio.NewScanner
for scanner.Scan {
msg := scanner.Text
fmt.Println
conn.Write)
}
}
func main {
ln,err := net.Listen
if err!= nil {
log.Fatal
}
defer ln.Close
fmt.Println
for {
conn,err := ln.Accept
if err!= nil {
log.Println
continue
}
go handleConn
}
}
b)TCP 客户端示例
package main
import (
"bufio"
"fmt"
"net"
)
func main {
conn,err := net.Dial
if err!= nil { panic }
fmt.Fprintf
response,_ := bufio.NewReader.ReadString
fmt.Println
}
五、性能调整:I/O 模型与 Goroutine 并发处理
I/O 模型选择:A Go 默认使用 epoll。话说回来,若需自定义,可直接使用 *net.TCPListener.
MPSC+goroutine:A single producer sending data to many goroutines 可以明显提高并发吞吐量。