network server in go #gocon 2013-11-14

37
NetWork & IO I/O and binary programming 2013/11/14 #GoCon

Upload: jxck-

Post on 06-May-2015

1.677 views

Category:

Technology


1 download

DESCRIPTION

Develop binary based network server in Go introduction of []byte, bytes, encoding/binary, bufio etc

TRANSCRIPT

Page 1: Network server in go  #gocon 2013-11-14

NetWork & IOI/O and binary programming

2013/11/14#GoCon

Page 2: Network server in go  #gocon 2013-11-14

Jack

● id: Jxck● github: Jxck● twitter: jxck_● about: http://jxck.io● blog: http://d.hatena.ne.jp/jxck● Love: music

Page 3: Network server in go  #gocon 2013-11-14
Page 4: Network server in go  #gocon 2013-11-14

https://github.com/goken/goken

Go研

Page 5: Network server in go  #gocon 2013-11-14

Now working on ...

● http2 server/client○ github.com/Jxck/http2○ github.com/Jxck/hpack○ github.com/Jxck/logger○ github.com/Jxck/color

● Caution○ not enough error handling○ not enough test○ not enough api/feature○ under heavy working :p

Page 6: Network server in go  #gocon 2013-11-14

network serverI/O and binary programming

Page 7: Network server in go  #gocon 2013-11-14

NetWork Server in Go

● net● []byte● bytes● encoding/binary● io● io/ioutil● bufio

Page 8: Network server in go  #gocon 2013-11-14

No Error Handling in Sample Codesfunc main() {

listener, err := net.Listen("tcp", "127.0.0.1:3000") // err

if err != nil {

log.Fatal(err)

}

for {

conn, err := listener.Accept() // err

if err != nil {

log.Fatal(err)

}

defer func() {

log.Println("close connection")

conn.Close()

}()

_, err = conn.Write([]byte("hello\n")) // send hello

if err != nil {

log.Fatal(err)

}

}

}Hard To Read on Slide

Page 9: Network server in go  #gocon 2013-11-14

import “net”tcp server in go

Page 10: Network server in go  #gocon 2013-11-14

TCP Serverpackage main

import "net"

func main() {

listener, _ := net.Listen("tcp", ":3000")

for {

conn, _ := listener.Accept()

conn.Write([]byte("hello\n"))

conn.Close()

}

}

Page 11: Network server in go  #gocon 2013-11-14

TCP Server With Handlerfunc main() {

listener, _ := net.Listen("tcp", ":3000")

for {

conn, _ := listener.Accept()

handleConn(conn)

}

}

func handleConn(conn net.Conn) {

conn.Write([]byte("hello\n"))

}

Page 12: Network server in go  #gocon 2013-11-14

TCP Server with Goroutinefunc main() {

listener, _ := net.Listen("tcp", ":3000")

for {

conn, _ := listener.Accept()

go handleConn(conn)

}

}

func handleConn(conn net.Conn) {

conn.Write([]byte("hello\n"))

}

Page 13: Network server in go  #gocon 2013-11-14

[]bytehandle octet stream in go

Page 14: Network server in go  #gocon 2013-11-14

binary format (example)

R Length(14) Type(8) Flags(8)

R Stream Identifier(31)

Reserved(8) Setting Identifier(24)

Value(32)

[]byte{0, 8, 4, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 16, 0}

Page 15: Network server in go  #gocon 2013-11-14

low level byte slice handlingfunc main() {

b := []byte{}

b = append(b, []byte{0, 8}...) // length 8

b = append(b, 4) // type 4

b = append(b, 0) // flags 0

// stream id 1

b = append(b, []byte{0, 0, 0, 1}...)

// settings id 1

b = append(b, []byte{0, 0, 0, 1}...)

// value 4096

b = append(b, []byte{0, 0, 16, 0}...)

fmt.Println(b)

// [0 8 4 0 0 0 0 1 0 0 0 1 0 0 16 0]

}

Page 16: Network server in go  #gocon 2013-11-14

SWrap (slice wrap)import “github.com/Jxck/swrap”

type SWrap● func New(a []byte) SWrap

● func (sw *SWrap) Add(a byte)

● func (sw *SWrap) Bytes() []byte

● func (sw *SWrap) Compare(b []byte) bool

● func (sw *SWrap) Delete(i int)

● func (sw *SWrap) Len() int

● func (sw *SWrap) Merge(a []byte)

● func (sw *SWrap) Pop() byte

● func (sw *SWrap) Push(b byte)

● func (sw *SWrap) Replace(i int, b byte)

● func (sw *SWrap) Shift(b byte)

● func (sw *SWrap) UnShift() byte

Page 17: Network server in go  #gocon 2013-11-14

import “io”handle IO in go

Page 18: Network server in go  #gocon 2013-11-14

important: io.Reader, io.Writertype Reader interface {

Read(p []byte) (n int, err error)

}

type Writer interface {

Write(p []byte) (n int, err error)

}

type ReadWriter interface {

Reader

Writer

}

Page 19: Network server in go  #gocon 2013-11-14

net.Conn implements io.Writerfunc handleConn(conn net.Conn) {

conn.Write([]byte("hello\n"))

}

func handleConn(conn io.Writer) {

conn.Write(

[]byte{104, 101, 108, 108, 111, 10}

)

}

Page 20: Network server in go  #gocon 2013-11-14

import “bytes”utility for byte slice and Buffer

Page 21: Network server in go  #gocon 2013-11-14

bytes.Buffer: io.ReadWriter for []bytefunc handleConn(conn io.Writer) {

conn.Write([]byte{104, 101, 108, 108, 111, 10})

}

func main() {

b := []byte{}

buf := bytes.NewBuffer(b) // io.ReadeWriter

handleConn(buf)

actual := buf.Bytes()

bytes.Equal(

actual,

[]byte{104, 101, 108, 108, 111, 10},

) // true

}

Page 22: Network server in go  #gocon 2013-11-14

import “encoding/binary”

read/write fixed size value

Page 23: Network server in go  #gocon 2013-11-14

we did...func main() {

b := []byte{}

b = append(b, []byte{0, 8}...) // length 8

b = append(b, 4) // type 4

b = append(b, 0) // flags 0

// stream id 1

b = append(b, []byte{0, 0, 0, 1}...)

// settings id 1

b = append(b, []byte{0, 0, 0, 1}...)

// value 4096

b = append(b, []byte{0, 0, 16, 0}...)

fmt.Println(b)

// [0 8 4 0 0 0 0 1 0 0 0 1 0 0 16 0]

}

Page 24: Network server in go  #gocon 2013-11-14

Fixed Size

R Length(14) Type(8) Flags(8)

R Stream Identifier(31)

Reserved(8) Setting Identifier(24)

Value(32)

var Length uint16 = 8

var Type, Flags uint8 = 4, 0

var StreamId, SettingsId uint32 = 1, 1

var Value uint32 = 4096

Page 25: Network server in go  #gocon 2013-11-14

encoding/binary.Write()buf := bytes.NewBuffer([]byte{})

var Length uint16 = 8

var Type, Flags uint8 = 4, 0

var StreamId, SettingsId uint32 = 1, 1

var Value uint32 = 4096

binary.Write(buf, binary.BigEndian, Length)

binary.Write(buf, binary.BigEndian, Type)

// ...

binary.Write(buf, binary.BigEndian, Value)

fmt.Println(buf.Bytes())

// [0 8 4 0 0 0 0 1 0 0 0 1 0 0 16 0]

Page 26: Network server in go  #gocon 2013-11-14

encoding/binary.Write()buf := bytes.NewBuffer([]byte{})

frame := Frame{

Length: 8,

Type: 4,

Flags: 0,

StreamId: 1,

SettingsId: 1,

Value: 4096,

}

// func Write(w io.Writer, order ByteOrder, data

interface{}) error

binary.Write(buf, binary.BigEndian, frame)

fmt.Println(buf.Bytes())

type Frame struct {

Length uint16

Type uint8

Flags uint8

StreamId uint32

SettingsId uint32

Value uint32

}

Page 27: Network server in go  #gocon 2013-11-14

import “net”tcp client in go

Page 28: Network server in go  #gocon 2013-11-14

TCP Clientfunc main() {

conn, _ := net.Dial("tcp", ":3000")

b := make([]byte, 100)

n, _ := conn.Read(b)

fmt.Print(string(b[:n]))

// hello

}

Page 29: Network server in go  #gocon 2013-11-14

import “bufio”buffered io

Page 30: Network server in go  #gocon 2013-11-14

bufio := []byte(4096) + io// bufio.Reader

type Reader struct {}

// bufio.Writer

type Writer struct {}

func NewReader(rd io.Reader) *Reader {

// convert io.Reader to *bufio.Reader

}

func NewWriter(wr io.Writer) *Writer {

// convert io.Writer to *bufio.Writer

}

Page 31: Network server in go  #gocon 2013-11-14

TCP Client with bufiofunc main() {

conn, _ := net.Dial("tcp", ":3000")

br := bufio.NewReader(conn)

line, _ := br.ReadString('\n')

fmt.Print(line) // hello

}

Page 32: Network server in go  #gocon 2013-11-14

TCP Client with encoding/binarytype Frame struct {

Length uint16

Type uint8

Flags uint8

StreamId uint32

SettingsId uint32

Value uint32

}

func main() {

conn, _ := net.Dial("tcp", ":3000")

frame := &Frame{}

binary.Read(conn, binary.BigEndian, frame)

fmt.Print(frame) // &{8 4 0 1 1 4096}

}

Page 33: Network server in go  #gocon 2013-11-14

HTTP/2.0?

Page 34: Network server in go  #gocon 2013-11-14

HTTP/2.0 with Go

● tcp/tls connection○ net

● multiplexed stream○ goroutine / channel

● binary frame○ static type / encoding/binary

● crypto○ crypto

● build○ go build (cross compile)

● test○ go test (and testing)

Page 35: Network server in go  #gocon 2013-11-14

HTTP2.0 Study (#http2study)

● http2.0 勉強会 #2○ http://bit.ly/158zE4C

● http2.0 hackathon○ 12月 or 1月

Page 36: Network server in go  #gocon 2013-11-14

anyone ?

Q & A

Page 37: Network server in go  #gocon 2013-11-14

thanks :)

END