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

102 lines
2.6 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package main
// 连接子网服务器的客户端程序
import (
"TCPServerClient/utils"
"bufio"
"fmt"
"net"
"os"
"strconv"
"strings"
)
const (
DefaultServerIP = "localhost" // 服务器IP
DefaultServerPort = 50000 // 服务器端口号
DefaultRequestInfo = "Request Addr" // 请求子网IP
DefaultPassword = "12345678" // 消息加解密密码。必须是八位
)
type Client struct {
serverIP string
serverPort int
requestInfo string
password string
}
func (c *Client) start() {
// 初始化client
c.serverIP=DefaultServerIP
c.serverPort=DefaultServerPort
c.requestInfo=DefaultRequestInfo
c.password=DefaultPassword
// 连接服务器
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:=getSubServerAddr(conn)
if err != nil {
fmt.Println("Error getSubServerAddr", err.Error())
return
}else{
fmt.Println("Successful get sub server addr: "+subServerAddr)
}
// 连接子网服务器
conn, err = net.Dial("tcp", subServerAddr)
if err != nil {
fmt.Println("Error dialing to sub server", err.Error())
return
}else{
fmt.Println("Successful conn to sub server : "+conn.RemoteAddr().String())
}
// 向子网服务器发送数据
inputReader := bufio.NewReader(os.Stdin)
fmt.Println("First, what is your name?")
clientName, _ := inputReader.ReadString('\n')
trimmedClient := strings.Trim(clientName, "\r\n") // Windows 平台下用 "\r\n"Linux平台下使用 "\n"
// 给服务器发送信息直到程序退出
for {
// 接收用户输入
fmt.Println("What to send to the server? Type Q to quit.")
input, _ := inputReader.ReadString('\n')
trimmedInput := strings.Trim(input, "\r\n")
// 判断是否要退出
if trimmedInput == "Q" {
return
}
// 发送加密数据给服务器
_, err = conn.Write([]byte(utils.EncryptMsgByDES((trimmedClient + " says: " + trimmedInput),DefaultPassword)))
}
}
func getSubServerAddr(conn net.Conn) (string,error) {
// 发送加密请求给服务器
_,err := conn.Write([]byte(utils.EncryptMsgByDES(DefaultRequestInfo,DefaultPassword)))
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
}