我无法弄清楚为什么空字符串长达506个字节。
所以会发生什么事情,我打印一个像这样的屏幕字符串:
fmt.Printf("The last element '%s'\n", messages[1])
我得到了:
The last element ''
但是,当我打印它的长度时:
fmt.Printf("The last element len is '%s'\n", len(messages[len(messages) - 1]))
我明白了:
The last element len is '%!s(int=506)'
我不明白。有谁知道发生了什么?
我把整个程序留在这里(它很小)。要将输入传递给此程序,请执行以下操作:
printf "asti||" | netcat localhost 7777
这是程序本身:
package main
import (
"fmt"
"net"
"os"
"strings"
)
func main() {
end_of_message_terminator := "||"
beginning_of_next_message := ""
request := make([]byte, 512)
service_port := ":7777"
tcpAddr, err := net.ResolveTCPAddr("tcp4", service_port)
checkError(err)
listener, err := net.ListenTCP("tcp", tcpAddr)
checkError(err)
response_port := ":8887"
tcpAddr_res, err := net.ResolveTCPAddr("tcp4", response_port)
checkError(err)
response_writer, err := net.ListenTCP("tcp", tcpAddr_res)
for {
conn, err := listener.Accept()
if err != nil {
continue
}
read_len, err := conn.Read(request)
if read_len == 0 {
continue
}
request_string := string(request)
fmt.Printf("Request String %s\\END", request_string)
messages := strings.Split(request_string, end_of_message_terminator)
fmt.Printf("%q\n", messages)
messages[0] = beginning_of_next_message + messages[0]
fmt.Printf("%s\n", messages[0])
fmt.Printf("The last element '%s'\n", messages[1])
fmt.Printf("The last element '%s'\n", messages[len(messages) - 1])
fmt.Printf("The last element len is '%s'\n", len(messages[len(messages) - 1]))
fmt.Printf("The last element is equal to empty string? %s\n", messages[len(messages) - 1] == "")
if messages[len(messages) - 1] != "" {
beginning_of_next_message = messages[len(messages) - 1]
messages[len(messages) - 1] = ""
fmt.Printf("was here 00\n")
}
if len(messages) == 1 {
continue
}
conn.Close()
}
}
func checkError(err error) {
if err != nil {
fmt.Fprintf(os.Stderr, "Fatal error: %s", err.Error())
os.Exit(1)
}
}
答案 0 :(得分:2)
该计划正在处理整个request
,而不是Read
填写的部分。改变行
request_string := string(request)
到
request_string := string(request[:read_len])
解决此问题。
更好的解决方法是使用bufio.Scanner扫描邮件终结器。
func scanTerminator(data []byte, atEOF bool) (advance int, token []byte, err error) {
if atEOF && len(data) == 0 {
return 0, nil, nil
}
if i := bytes.Index(data, []byte("||")); i >= 0 {
return i + 2, data[:i], nil
}
if atEOF {
return len(data), data, nil
}
return 0, nil, nil
}
func main() {
...
for {
conn, err := listener.Accept()
if err != nil {
// handle error
}
s := bufio.NewScanner(conn)
s.Split(scanTerminator)
for s.Scan() {
message := s.Text()
// process message
}
if s.Err() != nil {
// handle error
}
}
}