Go練習題(10)

點對點聊天

v1版本

//server.go
package main

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

func main() {
	addr := "0.0.0.0:9999"
	listener,err := net.Listen("tcp",addr)
	if err != nil {
		fmt.Println(err)
	}
	fmt.Println("Listen",addr)
	defer listener.Close()
	for {
		client,_ := listener.Accept()
		client.Write([]byte(time.Now().Format("2016-1-2 15:20:10")))
		client.Close()
	}
}
//client.go
package main

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

func main() {
	addr := "192.168.0.105:9999"
	conn,err := net.Dial("tcp",addr)
	if err != nil {
		fmt.Println(err)
		os.Exit(-1)
	}
	bytes := make([]byte,1024)
	if n,err := conn.Read(bytes);err ==nil{
		defer  conn.Close()
		fmt.Println(string(bytes[:n]))
	}else {
		fmt.Println(err)
	}
}

v2

//server.go
package main

import (
	"bufio"
	"fmt"
	"net"
	"os"
	"strings"
)

func main() {
	addr := "0.0.0.0:9999"
	listener,err := net.Listen("tcp",addr)
	if err != nil {
		fmt.Println(err)
	}
	fmt.Println("Listen",addr)
	//defer listener.Close()
	for {
		client,err := listener.Accept()
		if err == nil {
			//用帶緩衝的io讀取以及寫入數據
			reader := bufio.NewReader(client)
			writer := bufio.NewWriter(client)
			imput := bufio.NewScanner(os.Stdin)
			fmt.Printf("客戶端%s連接成功\n",client.RemoteAddr())
			for {
				//寫入時間
				fmt.Printf("服務器(q退出):")
				imput.Scan()
				if imput.Text() == "q" {
					break
				}
				_,err := writer.WriteString(imput.Text()+"\n")
				writer.Flush()
				//當err時報錯的時候 退出
				if err != nil {
					break
				}
				//每次讀取一行  err時報錯的時候退出
				line ,err := reader.ReadString('\n')
				if err != nil {
					break
				}
				//打印每一行的數據
				//去除空白字符串
				fmt.Println("客戶端:",strings.TrimSpace(line))
			}
			fmt.Printf("客戶端%s關閉成功\n",client.RemoteAddr())
			client.Close()
		}
	}
}
//client.go
package main

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

func main() {
	addr := "192.168.0.105:9999"
	conn,err := net.Dial("tcp",addr)
	if err != nil {
		fmt.Println(err)
		os.Exit(-1)
	}
	reader := bufio.NewReader(conn)
	writer := bufio.NewWriter(conn)
	imput := bufio.NewScanner(os.Stdin)
	//一次讀一行  換行符結束
	defer 	conn.Close()
	for {
		line ,err := reader.ReadString('\n')
		if err != nil {
			break
		}
		fmt.Println("服務器:",line)
		fmt.Printf("請輸入(q退出):")
		imput.Scan()
		if imput.Text() == "q" {
			break
		}
		_,err = writer.WriteString(imput.Text()+"\n")
		if err != nil {
			break
		}
		writer.Flush()
		//fmt.Println(n,err)
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章