나는 Go -를 실험 중이며 텔넷으로 연결할 수 있고 명령을 보내고 응답을받을 수있는 TCP 서버를 만들고 싶습니다.Golang 서버에서 영구적 인 tcp 연결을 수락합니다.
const (
CONN_HOST = "localhost"
CONN_PORT = "3333"
CONN_TYPE = "tcp"
)
func main() {
listener, err := net.Listen(CONN_TYPE, fmt.Sprintf("%s:%s", CONN_HOST, CONN_PORT))
if err != nil {
log.Panicln(err)
}
defer listener.Close()
for {
conn, err := listener.Accept()
if err != nil {
log.Panicln(err)
}
go handleRequest(conn)
}
}
func handleRequest(conn net.Conn) {
buffer := make([]byte, 1024)
length, err := conn.Read(buffer)
if err != nil {
log.Panicln(err)
}
str := string(buffer[:length])
fmt.Println(conn.RemoteAddr().String())
fmt.Printf("Received command %d\t:%s\n", length, str)
switch str {
case "PING\r\n":
sendResponse("PONG", conn)
case "PUSH\r\n":
sendResponse("GOT PUSH", conn)
default:
conn.Write([]byte(fmt.Sprintf("UNKNOWN_COMMAND: %s\n", str)))
}
conn.Close() // closes the connection
}
func sendResponse(res string, conn net.Conn) {
conn.Write([]byte(res+"\n"))
}
위의 코드는 매번 연결을 닫아 터미널 세션에서 나를 쫓아냅니다. 하지만 실제로 원하는 것은 더 많은 I/O 작업을 위해 연결을 열어 둘 수 있어야한다는 것입니다. conn.Close()
을 제거하면 더 이상 응답을받지 못하기 때문에 어딘가에 서버가 멈춘 것 같습니다.
내가 해결 한 방법은 내 handleRequest 메서드를 끝없이 반복하여 메시지가 QUIT\r\n
메시지가 될 때까지 끝내지 않도록하는 것입니다. 이것이 적절한가요? 아니면 더 좋은 방법이 있습니까?
func handleRequest(conn net.Conn) {
for {
log.Println("Handling Request")
buffer := make([]byte, 1024)
length, err := conn.Read(buffer)
if err != nil {
log.Panicln(err)
}
str := string(buffer[:length])
fmt.Println(conn.RemoteAddr().String())
fmt.Printf("Received command %d\t:%s\n", length, str)
switch str {
case "PING\r\n":
sendResponse("PONG", conn)
case "PUSH\r\n":
sendResponse("GOT PUSH", conn)
case "QUIT\r\n":
sendResponse("Goodbye", conn)
conn.Close()
default:
conn.Write([]byte(fmt.Sprintf("UNKNOWN_COMMAND: %s\n", str)))
}
}
}
예 예를 두 번 이상 읽으려면 읽음을 반복해야합니다. 오류가 발생하면 당황하지 마십시오. 연결이 끊어지면 프로그램을 중단 할 이유가 없습니다. – JimB
이것이 올바른 구현이라고 생각합니다. 힌트 : 당신이'conn.Close()'를 호출 한 후에 break 문을 호출하면, for 루프가 영원히 계속 실행됩니다. – Tinwor
JimB Thanks. 오류에 대한 당황 스러움 - 나는 적절한 오류 처리기를 아직 만들지 않았기 때문에 dev에서하고있었습니다. 그리고 그 오류를 포착하고 싶었습니다. 틴워 - 잘 했어. – Gravy