[Golang] 从零开始写Socket Server(1): Socket-Client框架

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ahlxt123/article/details/47320161

第一次跑到互联网公司实习 。。感觉自己进步飞快啊~第一周刚写了个HTTP服务器用于微信公共号的点餐系统~ 第二周就直接开始一边自学GO语言一边写用于Socket的服务器了。。。

因为发现Golang这一块资料挺少的,接下来我会在Blog里把整个Server的Coding,还有遇到的坑都记录下来~

在golang中,网络协议已经被封装的非常完好了,想要写一个Socket的Server,我们并不用像其他语言那样需要为socket、bind、listen、receive等一系列操作头疼,只要使用Golang中自带的net包即可很方便的完成连接等操作~


在这里,给出一个最最基础的基于Socket的Server的写法:

package main
import (
	"fmt"
	"net"
	"log"
	"os"
)


func main() {

//建立socket,监听端口
	netListen, err := net.Listen("tcp", "localhost:1024")
	CheckError(err)
	defer netListen.Close()

	Log("Waiting for clients")
	for {
		conn, err := netListen.Accept()
		if err != nil {
			continue
		}

		Log(conn.RemoteAddr().String(), " tcp connect success")
		handleConnection(conn)
	}
}
//处理连接
func handleConnection(conn net.Conn) {

	buffer := make([]byte, 2048)

	for {

		n, err := conn.Read(buffer)

		if err != nil {
			Log(conn.RemoteAddr().String(), " connection error: ", err)
			return
		}


		Log(conn.RemoteAddr().String(), "receive data string:\n", string(buffer[:n]))

	}

}
func Log(v ...interface{}) {
	log.Println(v...)
}

func CheckError(err error) {
	if err != nil {
		fmt.Fprintf(os.Stderr, "Fatal error: %s", err.Error())
		os.Exit(1)
	}
}


唔,抛除Go语言里面10行代码有5行error的蛋疼之处,你可以看到,Server想要建立并接受一个Socket,其核心流程就是

netListen, err := net.Listen("tcp", "localhost:1024")

conn, err := netListen.Accept()

n, err := conn.Read(buffer)

这三步,通过Listen、Accept 和Read,我们就成功的绑定了一个端口,并能够读取从该端口传来的内容~

Server写好之后,接下来就是Client方面啦,我手写一个HelloWorld给大家:

package main

import (
	"fmt"
	"net"
	"os"
)

func sender(conn net.Conn) {
		words := "hello world!"
		conn.Write([]byte(words))
	fmt.Println("send over")

}



func main() {
	server := "127.0.0.1:1024"
	tcpAddr, err := net.ResolveTCPAddr("tcp4", server)
	if err != nil {
		fmt.Fprintf(os.Stderr, "Fatal error: %s", err.Error())
		os.Exit(1)
	}

	conn, err := net.DialTCP("tcp", nil, tcpAddr)
	if err != nil {
		fmt.Fprintf(os.Stderr, "Fatal error: %s", err.Error())
		os.Exit(1)
	}


	fmt.Println("connect success")
	sender(conn)

}

可以看到,Client这里的关键在于

tcpAddr, err := net.ResolveTCPAddr("tcp4", server)

conn, err := net.DialTCP("tcp", nil, tcpAddr)


这两步,主要是负责解析端口和连接~

写好Server和Client之后,让我们运行一下看看:~~

成功运行,Console出现Server等待连接的提示:




然后我们运行Client:



成功连接Server啦,让我们看看Server那边的成果:


Server端成功的收到了我们的Hello-World啦,至于后面的那行红字,则是断开连接的提示~


到这里,一个最基础的使用Socket的Server-Client框架就出来啦~

如果想要让Server能够响应来自不同Client的请求,我们只要在Server端的代码的main入口中,

在 handleConnection(conn net.Conn) 这句代码的前面加上一个 go,就可以让服务器并发处理不同的Client发来的请求啦


关于Golang的并发处理,可以参考这里 Golang并行计算


下一篇,我会写一下如何在Server和Client中设计一个通讯协议,从而达到自己的一些特殊要求~


我已经把SocketServer系列的代码整合到了一起,发布到了我个人的github上:点击链接, 希望大家有兴趣的可以学习star一下~

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页