mirror of
https://gitee.com/willfree/tcpserver-client.git
synced 2026-06-15 19:24:52 +08:00
102 lines
2.6 KiB
Go
102 lines
2.6 KiB
Go
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
|
||
}
|