golang tcp

/**
  golang tcp
*/
package main

import (
	"fmt"
	"net"
	"strings"
	"time"
)

var p = fmt.Println

func server() {
	tcpAddr, _ := net.ResolveTCPAddr("tcp", ":7070")
	l, e := net.ListenTCP("tcp", tcpAddr)
	defer func() {
		p("server closed")
		l.Close()
	}()
	if e != nil {
		return
	}
	for {
		conn, e := l.Accept()
		conn.SetDeadline(time.Now().Add(time.Second * 15))
		if e != nil {
			continue
		}
		go func(conn net.Conn) {
			defer func() {
				p("a clent closed or timeout")
				conn.Close()
			}()
			for {
				b := make([]byte, 25)
				_, e := conn.Read(b)
				if e != nil {
					p("server:", e)
					break
				}
				req := strings.TrimSpace(string(b))
				conn.Write([]byte("來之服務端的回覆:您輸入了>>" + req))
				if req == "exit" || req == "quit" {
					break
				}
			}
		}(conn)
	}
}

func main() {
	//server
	go server()
	//client
	tcpAddr, _ := net.ResolveTCPAddr("tcp4", "127.0.0.1:7070")
	conn, e := net.DialTCP("tcp4", nil, tcpAddr)
	defer func() {
		p("clent closed")
		conn.Close()
	}()
	if e != nil {
		return
	}
	go func() {
		for {
			b := make([]byte, 500)
			_, e := conn.Read(b)
			if e != nil {
				p("client:", e) //e: eof
				break
			}
			p(string(b))
		}
	}()
	p("-----客戶端:請輸入.....")
	for {
		var input string
		fmt.Scanln(&input)
		conn.Write([]byte(input))
		if input == "exit" || input == "quit" {
			break
		}
	}
	time.Sleep(4 * time.Second)
}




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章