點對點聊天
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)
}
}