Files
ProjectOctopus/port_forwarding/tcp_learn/socket_learn.go

80 lines
1.3 KiB
Go

package tcp_learn
import (
"fmt"
"log"
"net"
"time"
)
func handleConnection(conn net.Conn) {
defer conn.Close()
buf := make([]byte, 1024)
for {
n, err := conn.Read(buf)
if err != nil {
fmt.Println("Error reading:", err)
break
}
if n > 0 {
fmt.Printf("Received data from %s: %s\n", conn.RemoteAddr(), string(buf[:n]))
}
}
}
func TcpServer() {
addr, err := net.ResolveTCPAddr("tcp", "localhost:8080")
if err != nil {
log.Printf("Error accepting connection: %v", err)
}
listener, err := net.ListenTCP("tcp", addr)
if err != nil {
log.Fatalf("Error creating listener: %v", err)
}
defer listener.Close()
listener.SetDeadline(time.Now().Add(2 * time.Minute))
for {
conn, err := listener.Accept()
if err != nil {
log.Printf("Error accepting connection: %v", err)
return
}
go handleConnection(conn)
}
}
func TcpClient() chan bool {
exit := make(chan bool, 1)
tick := time.Tick(time.Second)
timeOut := time.After(time.Minute)
conn, err := net.Dial("tcp", "localhost:8080")
if err != nil {
log.Fatalf("Error creating listener: %v", err)
return nil
}
for {
select {
case <-timeOut:
fmt.Println("timeout exit!")
exit <- true
return exit
case <-tick:
_, err := conn.Write([]byte("Hello from tcp client !"))
if err != nil {
log.Fatalf("Error write tcp : %v", err)
}
}
}
return exit
}