互联网中主机和主机连接必须遵守特定的要求,这个要求成为协议
osi开放式系统互联,定义了计算机互联时网络通信的7层
type TCPAddr struct{
IP IP
Port int
zone string
}
type TCPConn struct{
conn
}
type TCPListener struct{
fd *netFD
}
package main
import (
“net”
“fmt”
)
func main(){
//创建TCPAddress变量,指定协议tcp4,监听本机8899端口
addr,_:= net.ResolveTCPAddr(“tcp4”,“localhost:8899”)
//监听TCPAddress设定的地址
lis,_ := net.ListenTCP(“tcp4”,addr)
fmt.Println(“服务器已经启动”)
//服务器端添加死循环,不停接收客户端对象
fo{
//阻塞式等待客户端消息,返回连接对象,用于接收客户端消息或向客户端发送消息
conn,_ := lis.Accept()
//在此处添加协程实现并发
go func() {
//把数据读取到切片中
b:= make([]byte,256)
fmt.Println(“read之前”)
//客户端没有发送数据且客户端对象没有关闭,Read()将会阻塞,一旦接收到数据就不阻塞
count,_:= conn.Read(b)
fmt.Println(“接收到的数据”,string(b[:count]))
//向客户端发送消息
conn.Write(append([]byte*(“server:”),b[:count]…))
//关闭连接
conn.Close()
}()
}
fmt.Println(“服务器结束”)
}
package main
func main(){
//创建服务器端地址
addr,_:= net.ResolveTCPAddr(“tcp4”,“localhost:8899”)
//创建连接
conn,_:= net.DialTCP(“tcp”,nil,addr)
//发送数据
conn.Write([]byte(“客户端发送的数据”))
//接收信息
b := make([]byte,1024)
count,_:=conn,Read(b)
fmt.Println(“服务器发送回来的消息为:”,b[:count])
//关闭连接
conn.Close()
}
-项目结构如下:
–项目名
–src
–client
client.go
–server
server.go
main.go
type user struct {
Username string
OtherUsername string
Msg string
ServerMsg string
}
var(
userMap =make(map[string]net.Conn)
user = new(User)
)
func main(){
addr,_ := net.ResolveTCPAddr(“tcp4”,“:要链接的端口号”)
lis,_ := net.ListenTCP(“tcp4”,addr)
for{
conn,_ := lis.Accept()
go func(){
for{
b:= make([]byte,512)
count,_ := conn.Read(b)
arrStr := strings.Split(string(b[:count]),“-”)
user.Username = arrStr[0]
user.OtherUsername = arrStr[1]
user.Msg = arrStr[2]
user.ServerMsg = arrStr[3]
userMap[user.Username] = conn
if v,ok := userMap[user.OtherUsername];ok&&v != nil{
user.ServerMsg = “”
n,e := v.Write([]byte(fmt.Sprintf(“%s-%s-%s-%s”,user.Username),user.OtherUsername,user.Msg,user.ServerMsg))
fmt.Println(n,e)
if n==0 || e != nil{
delete(user.Map,user.OtherUsername)
conn.Close()
v.Vlose()
break
}
else{
user.ServerMsg = “对方不在线”
n,e := conn.Write([]byte(fmt.Sprintf(“%s-%s-%s-%s”,user.Username),user.OtherUsername,user.Msg,user.ServerMsg))
fmt.Println(n,e)
}
}()
}
}
}
package main
type User struct{
Username string
OtherUsername string
Msg string
ServerMsg string
}
var(
user = new(User)//当前登录用户信息
wg sync.WaitGroup
)
func main(){
wg.Add(1)
fmt.Println(“请输入您的账号:”)
fmt.Scanln(&user.Username)
fmt.Println(“请输入要给谁发送信息”)
fmt.Scanln(&user.OtherUsername)
addr,_ := net.ResolveTCPAddr(“tcp4”,“loaclhost:8899”)
conn._ := net.DialTCP(“tcp4”,nil,addr)
go func(){
fmt.Println(“请输入您要发送的消息:只提示一次”)
for{
fmt.Scanln(&user.Msg)
if user.Msg ==“exit”{
conn.Close()
wg.Done()
os.Exit(0)
}
conn.Write([]byte(fmt.Sprintf(“%s-%s-%s-%s”,user.Username,user.OtherUsername,user.Msg,user.ServerMsg)))
}
}()
//接收消息
go func(){
for{
b :=make([]byte,1025)
count,_ := conn,Read(b)
arry:= strings.Split(string(b[:count]),sep"-“)
user2 := new(User)
user2.Username =array[0]
user2.OtherUsername=array[1]
user2.Msg=array[2]
user2.ServerMsg=array[3]
if user2.ServerMsg != “”{
fmt.Println(”\t\t服务器的消息:“,user2.ServerMsg)
}else{
fmt.Println(”\t\t",user2.Username,“:”,user2.Msg)
}
}
}()
wg.Wait()
}