mirror of
https://gitee.com/willfree/tcpserver-client.git
synced 2026-06-09 14:49:38 +08:00
117 lines
2.8 KiB
Go
117 lines
2.8 KiB
Go
package main
|
|
// 连接可用服务器的客户端程序
|
|
|
|
import (
|
|
"TCPServerClient/utils"
|
|
"errors"
|
|
"fmt"
|
|
"net"
|
|
"strconv"
|
|
)
|
|
|
|
const (
|
|
DefaultServerIP = "127.0.0.1" // 地址服务器IP
|
|
DefaultServerPort = 50000 // 地址服务器端口号
|
|
DefaultRequestInfo = "Request Addr" // 请求可用IP的命令字段
|
|
DefaultAuthenticationInfo = "User Authentication" // 验证用户身份的命令字段
|
|
DefaultPassword = "12345678" // 消息加解密密码。必须是八位
|
|
)
|
|
|
|
type Client struct {
|
|
serverIP string
|
|
serverPort int
|
|
requestInfo string
|
|
authInfo string
|
|
password string
|
|
user User // 使用客户端的用户信息
|
|
}
|
|
|
|
|
|
func (c *Client) start() {
|
|
// 初始化client
|
|
c.serverIP=DefaultServerIP
|
|
c.serverPort=DefaultServerPort
|
|
c.requestInfo=DefaultRequestInfo
|
|
c.authInfo=DefaultAuthenticationInfo
|
|
c.password=DefaultPassword
|
|
c.user.Ini()
|
|
|
|
// 连接服务器
|
|
conn, err := net.Dial("tcp", c.serverIP+":"+strconv.Itoa(c.serverPort))
|
|
if err != nil {
|
|
// 由于目标计算机积极拒绝而无法创建连接
|
|
fmt.Println("Error dialing to main server", err.Error())
|
|
return
|
|
}else{
|
|
fmt.Println("Successful conn to main server : "+conn.RemoteAddr().String())
|
|
}
|
|
|
|
// 请求可用服务器地址
|
|
subServerAddr,err:=c.getSubServerAddr(conn)
|
|
if err != nil {
|
|
fmt.Println("Error getSubServerAddr", err.Error())
|
|
return
|
|
}else{
|
|
fmt.Println("Successful get sub server addr: "+subServerAddr)
|
|
}
|
|
|
|
// 连接可用服务器,
|
|
// 并做一些事。。。
|
|
}
|
|
|
|
// 请求可用服务器地址
|
|
func (c *Client) getSubServerAddr(conn net.Conn) (string,error) {
|
|
// 验证用户身份
|
|
b,err:=c.userAuthentication(conn)
|
|
if !b {
|
|
return "", err
|
|
}
|
|
|
|
// 发送加密请求给服务器
|
|
_, err = conn.Write([]byte(utils.EncryptMsgByDES(c.requestInfo, c.password)))
|
|
if err != nil {
|
|
fmt.Println("Error writing", err.Error())
|
|
return "",err
|
|
}
|
|
|
|
// 接收服务器的返回地址
|
|
buf := make([]byte, 512)
|
|
len,err := conn.Read(buf)
|
|
if err!=nil {
|
|
fmt.Println("Error reading", err.Error())
|
|
return "",err
|
|
}
|
|
|
|
return string(buf[:len]),nil
|
|
}
|
|
|
|
// 验证用户身份
|
|
func (c *Client) userAuthentication(conn net.Conn) (bool,error){
|
|
// 发送验证用户身份的请求给服务器
|
|
_,err := conn.Write([]byte(utils.EncryptMsgByDES(c.authInfo+c.user.GetCertification(),c.password)))
|
|
if err != nil {
|
|
fmt.Println("Error writing", err.Error())
|
|
return false,err
|
|
}
|
|
|
|
//_,err = conn.Write([]byte(utils.EncryptMsgByDES(c.user.GetCertification(),c.password)))
|
|
//if err != nil {
|
|
// fmt.Println("Error writing", err.Error())
|
|
// return false,err
|
|
//}
|
|
|
|
// 接收验证结果
|
|
buf := make([]byte, 512)
|
|
len,err := conn.Read(buf)
|
|
if err!=nil {
|
|
fmt.Println("Error reading", err.Error())
|
|
return false,err
|
|
}
|
|
if string(buf[:len])=="true" {
|
|
fmt.Println("authentication success")
|
|
return true,nil
|
|
}else{
|
|
return false,errors.New("authentication failed")
|
|
}
|
|
}
|