mirror of
https://gitee.com/willfree/tcpserver-client.git
synced 2026-06-03 16:16:18 +08:00
93 lines
2.2 KiB
Go
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()
|
|
} |