用其他语言写Socket程序通常的步骤是:
服务端:Socket——>bind——>listen——>accept——>read/recv和write/send——>close
客户端:Socket——>connect——>read/recv和write/send——>close
而在Go语言中,写Socket程序被简化为:
服务端:Listen——>Accept——>Read/Write
客户端:Dial——>Read/Write
Server端代码如下:
package main
import (
"fmt"
"os"
"net"
"log"
)
//定义CheckError方法,避免写太多到 if err!=nil
func CheckError(err error) {
if err!=nil{
fmt.Fprintf(os.Stderr,"Fatal error:%s",err.Error())
os.Exit(1)
}
}
//自定义log
func Log(v... interface{}) {
log.Println(v...)
}
func main() {
server_listener,err:=net.Listen("tcp","localhost:8848")
CheckError(err)
defer server_listener.Close()
Log("Waiting for clients connect")
for{
new_conn,err:=server_listener.Accept()
CheckError(err)
go MsgHandler(new_conn)
}
}
//处理业务逻辑
func MsgHandler(conn net.Conn) {
buf:=make([] byte,1024)
defer conn.Close()
for{
n,err:=conn.Read(buf)
if err!=nil{
fmt.Println("connection close")
return
}
fmt.Println("client say:",string(buf[:n]))
clientIp:=conn.RemoteAddr()
Log(clientIp)
conn.Write([] byte("hello:"+clientIp.String()+"\n"))
}
}
Client端代码如下:
package main
import (
"fmt"
"os"
"net"
)
//定义CheckError方法,避免写太多到 if err!=nil
func CheckError(err error) {
if err!=nil{
fmt.Fprintf(os.Stderr,"Fatal error:%s",err.Error())
os.Exit(1)
}
}
func main() {
if len(os.Args) !=2 {
fmt.Fprintf(os.Stderr,"Usage:%s IP:Port\n",os.Args[0])
os.Exit(1)
}
//动态传入服务端IP和端口号
service:=os.Args[1]
tcpAddr,err:=net.ResolveTCPAddr("tcp4",service)
CheckError(err)
conn,err:=net.DialTCP("tcp",nil,tcpAddr)
CheckError(err)
conn.Write([] byte("hello server!"))
buf:=make([] byte,1024)
n,_:=conn.Read(buf)
fmt.Print(string(buf[:n]))
}