点对点聊天
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)
}
}