Files
tcpserver-client/Server/Server.go
T
2021-04-30 19:00:29 +08:00

93 lines
2.2 KiB
Go

package main
// 分配子网边界服务器地址的服务器
import (
"fmt"
"net"
"strconv"
"TCPServerClient/utils"
)
const (
DefaultServerIP = "localhost" // 服务器IP
DefaultServerPort = 50000 // 服务器端口号
DefaultRequestInfo = "Request Addr" // 请求子网IP
DefaultPassword = "12345678" // 消息加解密密码。必须是八位
)
type Server struct {
serverIP string
serverPort int
}
// 开启server,并建立监听
func (s *Server) start() {
fmt.Println("Starting the main server ...")
// 初始化
s.serverIP=DefaultServerIP
s.serverPort=DefaultServerPort
// 创建 listener
listener, err := net.Listen("tcp", s.serverIP+":"+strconv.Itoa(s.serverPort))
if err != nil {
fmt.Println("Error listening", err.Error())
return
}
// 监听并接受来自客户端的连接,并进行处理
for {
conn, err := listener.Accept()
if err != nil {
fmt.Println("Error accepting", err.Error())
return
}else{
fmt.Println("Main Server Accept conn form "+conn.RemoteAddr().String())
}
// 处理客户端请求
go doMainServerStuff(conn)
}
}
/**
处理客户端请求:只对请求子网地址的客户端连接进行响应
*/
func doMainServerStuff(conn net.Conn) {
for {
// 读取原始数据
buf := make([]byte, 512)
len, err := conn.Read(buf)
if err != nil {
fmt.Println("Error reading", err.Error())
return
}
msg:=string(buf[:len])
fmt.Println("Received raw data: %v", msg)
// 解密数据为可读格式
msg=utils.DecryptMsgByDES(msg,DefaultPassword)
fmt.Println("Received decrypt data: %v", msg)
// 判断是否是请求子网IP。是,则返回一个可用IP()
if(msg!=DefaultRequestInfo){
fmt.Println("Unable to handle request: %v", msg)
continue
}
ip,port:=searchAddr()
// 将该子网地址返回给客户端
len, err = conn.Write([]byte(ip+":"+strconv.Itoa(port)))
if err != nil {
fmt.Println("Error writing", err.Error())
}else{
fmt.Println("Send addr information to client successfully.")
}
_ = conn.Close()
return
}
}
/**
搜索子网,寻找一个可用的接入IP
*/
func searchAddr() (ip string,port int) {
addrList:=new(AddrList)
return addrList.iniAndGetIP()
}