从零开始写Go网络通信框架(1)——基本的Socket Client/Server的编写

用其他语言写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]))





}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MXi4oyu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值