I am new to go, I was trying to prepare client server in go language and tried to write code, but it's not giving any output. It's not giving any error but just listening.
Please someone help me, I want to create authentication system using go where server authenticate client using Username password..
server :
package main
import (
"fmt"
"net"
)
func main() {
service := "0.0.0.0:8080"
tcpAddr, err := net.ResolveTCPAddr("tcp", service)
checkError(err)
listener, err := net.ListenTCP("tcp", tcpAddr)
checkError(err)
for {
conn, err := listener.Accept()
//fmt.Println("Server listerning")
_, err = conn.Read([]byte("HEAD"))
if err != nil {
conn.Close()
}
if err != nil {
continue
}
}
}
func checkError(err error) {
if err != nil {
fmt.Println("Fatal error ", err.Error())
}
}
client :
package main
import (
"bufio"
"fmt"
"net"
"os"
"strings"
)
func main() {
if len(os.Args) != 2 {
fmt.Println("Usage: ", os.Args[0], "host")
os.Exit(1)
}
host := os.Args[1]
conn, err := net.Dial("tcp", host+":8080")
checkError(err)
_, err = conn.Write([]byte("HEAD"))
reader := bufio.NewReader(os.Stdin)
for {
line, err := reader.ReadString('
')
ftm.Println(err)
line = strings.TrimRight(line, " \t
")
if err != nil {
conn.Close()
break
}
}
}
func checkError(err error) {
if err != nil {
fmt.Println("Fatal error ", err.Error())
}
}
I'm not sure you need to resolve your address in order to listen.
You should be able to do just this :
listener, err := net.Listen("tcp", ":8080")
And you don't seem to do anything with the received bytes server side (you discard the result of Read
), which explains why you think you receive nothing.
Note that your code can only handle one connection at a time. You should handle each opened connection in a new goroutine.
Here's an example of client-server communication over TCP in a related question.
I'm not sure exactly what output your expecting, as it seems to me that you are not printing anything out, just reading input in the client. As @dystroy pointed out, the server then discards what it received, only checking for errors in the communication.
Also, it seems that your server should just sit there listening, as you have it in a loop doing just that. If you look in the docs for the net package, it gives an example of how to run a server and client. Here's a sample that I made from that, that worked for me.
Server:
ln, err := net.Listen("tcp", ":8080")
// handle error
for {
conn, err := ln.Accept()
// handle error
var cmd []byte
fmt.Fscan(conn, &cmd)
fmt.Println("Message:", string(cmd))
}
Client:
conn, err := net.Dial("tcp", "127.0.0.1:8080")
// handle error
fmt.Fprintf(conn, "message
")
Edited to add: The expected result of this program is that you run the server and it sits waiting. You then run the client in a different terminal, which immediately exits, but now the server has printed "Message: message". If you run the client again, the server will print the same message again. I tested this code on my machine (just adding code to respond to errors) and it worked as advertised.