zhenxing1114

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

一、服务器设计

1. 注册端口;

2. 监听端口 —— ListenTCP( );

3. 接收请求 —— Accept( );

4. 接收数据 或 发送数据 —— Read( ) 或 Write( );

// Server.go
package main

import "fmt"
import "os"
import "net"

func main() {
    service := ":6000"
    tcpaddr, err := net.ResolveTCPAddr("tcp", service)
    checkError(err)
    listener, err := net.ListenTCP("tcp", tcpaddr)
    checkError(err)

    for {
        conn, err := listener.Accept()
        if err != nil {
            continue
        }
        go handleClient(conn)
        //conn.Close()
    }
}

func handleClient(conn net.Conn) {
    defer conn.Close()
    var buf [512]byte
    for {
        n, err := conn.Read(buf[0:])
        if err != nil {
            return
        }
        rmtAddr := conn.RemoteAddr()
        fmt.Println("rcv msg from client", rmtAddr.String(), string(buf[0:n]))
        _, err2 := conn.Write([]byte("hello client"))
        if err2 != nil {
            return
        }
    }
}

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

 

二、客户端设计

1. 获取地址;

2. 发送请求;

3. 接收数据 或 发送数据 —— Read( ) 或 Write( );

4. 关闭连接 —— Close( );

// client.go
package main

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

func main() {
    var buf [512]byte
    service := os.Args[1]
    tcpaddr, err := net.ResolveTCPAddr("tcp", service)
    checkError(err)
    conn, err := net.DialTCP("tcp", nil, tcpaddr)
    checkError(err)
    rmtaddr := conn.RemoteAddr()
    n, err := conn.Write([]byte("hello server"))
    checkError(err)
    n, err = conn.Read(buf[0:])
    checkError(err)
    fmt.Println("reply from server", rmtaddr.String(), string(buf[0:n]))
    conn.Close()
    os.Exit(0)
}

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

 

posted on 2014-11-20 09:43  zhenxing1114  阅读(171)  评论(0编辑  收藏  举报