可以接收及发送数据

This commit is contained in:
suguo.yao 2021-11-29 22:28:27 +08:00
parent 84a33fad18
commit f5652a5c91
5 changed files with 100 additions and 28 deletions

1
.gitignore vendored
View File

@ -2,3 +2,4 @@
logs/ logs/
tcp-socket tcp-socket
go.sum go.sum
.vscode/

54
main.go
View File

@ -1,11 +1,11 @@
package main package main
import ( import (
"fmt"
"net" "net"
"strings"
"github.com/sirupsen/logrus" "github.com/sirupsen/logrus"
"myschools.me/suguo/tcp-socket/model"
"myschools.me/suguo/tcp-socket/service"
) )
func main() { func main() {
@ -15,6 +15,9 @@ func main() {
"func": "main", "func": "main",
}).Fatalf("net.Listen: %s", err.Error()) }).Fatalf("net.Listen: %s", err.Error())
} }
defer srv.Close()
go service.DataProcess()
for { for {
conn, err := srv.Accept() conn, err := srv.Accept()
@ -29,6 +32,11 @@ func main() {
} }
func connHandler(c net.Conn) { func connHandler(c net.Conn) {
endpoint := c.RemoteAddr().String()
logrus.WithFields(logrus.Fields{
"func": "main",
}).Infof("client is connected, %s", endpoint)
//1.conn是否有效 //1.conn是否有效
if c == nil { if c == nil {
logrus.WithFields(logrus.Fields{ logrus.WithFields(logrus.Fields{
@ -36,11 +44,19 @@ func connHandler(c net.Conn) {
}).Warnf("srv.Accept: %s", "无效的conn") }).Warnf("srv.Accept: %s", "无效的conn")
return return
} }
//2.新建网络数据流存储结构 defer func() {
buf := make([]byte, 4096) if err := c.Close(); err != nil {
//3.循环读取网络数据流 logrus.WithFields(logrus.Fields{
"func": "main",
}).Debugf("c.Close: %s", err.Error())
}
}()
service.ClientSet(endpoint, c)
for { for {
//3.1 网络数据流读入 buffer //2.新建网络数据流存储结构
buf := make([]byte, 4096)
cnt, err := c.Read(buf) cnt, err := c.Read(buf)
//3.2 数据读尽、读取错误 关闭 socket 连接 //3.2 数据读尽、读取错误 关闭 socket 连接
if cnt == 0 || err != nil { if cnt == 0 || err != nil {
@ -48,27 +64,9 @@ func connHandler(c net.Conn) {
break break
} }
//3.3 根据输入流进行逻辑处理 service.DataPush(&model.Packet{
//buf数据 -> 去两端空格的string Endpoint: endpoint,
inStr := strings.TrimSpace(string(buf[0:cnt])) Data: buf[:cnt],
//去除 string 内部空格 })
cInputs := strings.Split(inStr, " ")
//获取 客户端输入第一条命令
fCommand := cInputs[0]
fmt.Println("客户端传输->" + fCommand)
switch fCommand {
case "ping":
c.Write([]byte("服务器端回复-> pong\n"))
case "hello":
c.Write([]byte("服务器端回复-> world\n"))
default:
c.Write([]byte("服务器端回复" + fCommand + "\n"))
}
//c.Close() //关闭client端的连接telnet 被强制关闭
fmt.Printf("来自 %v 的连接关闭\n", c.RemoteAddr())
} }
} }

6
model/packet-model.go Normal file
View File

@ -0,0 +1,6 @@
package model
type Packet struct {
Endpoint string
Data []byte
}

21
service/client-service.go Normal file
View File

@ -0,0 +1,21 @@
package service
import "net"
var _clients map[string]net.Conn
func init() {
_clients = make(map[string]net.Conn)
}
func ClientSet(endpoint string, conn net.Conn) {
_clients[endpoint] = conn
}
func ClientGet(endpoint string) net.Conn {
conn := _clients[endpoint]
if conn == nil {
delete(_clients, endpoint)
}
return conn
}

46
service/data-service.go Normal file
View File

@ -0,0 +1,46 @@
package service
import (
"fmt"
"myschools.me/suguo/tcp-socket/model"
)
var _data chan *model.Packet
func init() {
_data = make(chan *model.Packet, 1024)
}
func DataPush(packet *model.Packet) {
_data <- packet
}
func DataProcess() {
for {
data := <-_data
fmt.Println(string(data.Data))
switch string(data.Data[:1]) {
case "a":
go dataA((data))
case "b":
go dataB((data))
}
}
}
func dataA(p *model.Packet) {
cc := ClientGet(p.Endpoint)
if cc == nil {
return
}
cc.Write([]byte("AAAAAAAAAA"))
}
func dataB(p *model.Packet) {
cc := ClientGet(p.Endpoint)
if cc == nil {
return
}
cc.Write([]byte("BBBBBBBBBBBBB"))
}