今天开始练习用golang写网络服务了,首先就拿聊天室来练手吧。
先试试基本的通信,熟悉一下基本的API。
server端代码:
package main
import (
"github.com/apex/log"
"net"
)
//我靠,为什么不能用指针调用接口,这是什么骚设计?
//func handleOneClient(client *net.Conn) {
func handleOneClient(client net.Conn) {
defer client.Close()
buf := make([]byte, 1024)
nbytes, err := client.Read(buf)
if err != nil {
return
}
log.Info(string(buf[:nbytes]))
}
func main() {
listener,err := net.Listen("tcp4", "127.0.0.1:54321")
if err != nil {
return
}
for {
oneClient, err := listener.Accept()
if err != nil {
continue
}
go handleOneClient(oneClient)
}
}
写服务端代码的时候,让我感到困惑的是,写handleOneClient函数的时候,我一开始设计参数类型是*net.Conn,然后在函数内部发现这货居然无法调用函数!!!
然后我就查看了一下net.Conn定义,发现它是一个Interface。
这是不是一个规则,就是类型是Interface的时候,不要设计成Interface的指针,直接使用Interface,否则不能调用其函数。但为什么就不能调用其函数,这一点我没搞懂。
这里采用了one-goroutine-per-connetion的模型。
client代码:
package main
import "net"
func main() {
conn, err := net.Dial("tcp4", "127.0.0.1:54321")
if err != nil {
return
}
defer conn.Close()
_, err = conn.Write([]byte("hello world"))
if err != nil {
return
}
}
客户端就没什么好说的,太简单了。
(全文万)
本文分享了使用Golang实现网络服务的实践经验,通过构建聊天室应用熟悉基本API,探讨了接口与指针调用的问题,并采用one-goroutine-per-connection模型处理连接。
6万+

被折叠的 条评论
为什么被折叠?



