这个 hello world 主要是 server-client 形式的应用。 功能很简单, client 给 server 发送 ping/pong 的消息,server 回复 pong/ping 消息。
if strings.EqualFold(recieve[0:len(recieveDefault)],recieveDefault) {
go send(conn,sendDefault)
}else if strings.EqualFold(recieve[0:len(sendDefault)],sendDefault) {
go send(conn,recieveDefault)
}
package main
import (
"fmt"
"net"
"strings"
"time"
"math/rand"
// "reflect"
)
func main(){
_, isClient,err := clientPre()
if err != nil {
server()
return
}
if isClient {
client()
return
}
server()
}
func clientPre()(conn net.Conn, isClient bool, err error) {
//打开连接:
conn, err = net.Dial("tcp", "localhost:18080")
if err != nil {
isClient = false
fmt.Println(err.Error())
return
}
isClient = true
conn.Close()
return
}
func client(){
sendContent := [2]string{"ping","pong"}
conn, err := net.Dial("tcp", "localhost:18080")
fmt.Println("client: ",conn.LocalAddr(),"server: ",conn.RemoteAddr()," ",rand.Intn(100)," ",sendContent[rand.Intn(100)%2])
_,err = send(conn,sendContent[rand.Intn(100)%2])
if err != nil {
fmt.Println(err.Error())
return
}
doServerStuff(conn)
return
}
func server() {
listener, err := net.Listen("tcp", "0.0.0.0:18080")
fmt.Println("server listen 18080")
if err != nil {
fmt.Println("开启端口错误,终止进程", err.Error())
return //终止程序
}
// 监听并接受来自客户端的连接
for {
conn, err := listener.Accept()
if err != nil {
fmt.Println("Error accepting", err.Error())
return // 终止程序
}
go doServerStuff(conn)
}
}
func doServerStuff(conn net.Conn) {
count := 0
recieveDefault := "ping"
sendDefault := "pong"
for {
count += 1
recieve,err := rev(conn)
if err != nil {
return
}
fmt.Printf("%d ", count)
if strings.EqualFold(recieve[0:len(recieveDefault)],recieveDefault) {
go send(conn,sendDefault)
}else if strings.EqualFold(recieve[0:len(sendDefault)],sendDefault) {
go send(conn,recieveDefault)
}
}
}
func send(conn net.Conn, content string)(send string, err error){
time.Sleep(100 * time.Millisecond)
_, err = conn.Write([]byte(content))
if err != nil {
fmt.Println("发送错误.", err.Error())
return
}
send = content
fmt.Println("send", send)
return
}
func rev(conn net.Conn)(recieve string, err error){
buf := make([]byte, 512)
_, err = conn.Read(buf)
if err != nil {
fmt.Println("接收停止,原因:", err.Error())
return
}
recieve = string(buf)
fmt.Printf("recieving: %v ", recieve)
return
}