Files
tcpserver-client/Client/Client.go
T

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")
}
}