forked from go/golangs_learn
10 changed files with 342 additions and 19 deletions
@ -0,0 +1,39 @@ |
|||||
|
package main |
||||
|
|
||||
|
import ( |
||||
|
"fmt" |
||||
|
"log" |
||||
|
"net" |
||||
|
"time" |
||||
|
) |
||||
|
|
||||
|
func echo(conn *net.TCPConn) { |
||||
|
tick := time.Tick(5 * time.Second) // 五秒的心跳间隔
|
||||
|
for now := range tick { |
||||
|
n, err := conn.Write([]byte(now.String())) |
||||
|
if err != nil { |
||||
|
log.Println(err) |
||||
|
conn.Close() |
||||
|
return |
||||
|
} |
||||
|
fmt.Printf("send %d bytes to %s\n", n, conn.RemoteAddr()) |
||||
|
} |
||||
|
} |
||||
|
func main() { |
||||
|
address := net.TCPAddr{ |
||||
|
IP: net.ParseIP("127.0.0.1"), // 把字符串IP地址转换为net.IP类型
|
||||
|
Port: 8000, |
||||
|
} |
||||
|
listener, err := net.ListenTCP("tcp4", &address) // 创建TCP4服务器端监听器
|
||||
|
if err != nil { |
||||
|
log.Fatal(err) // Println + os.Exit(1)
|
||||
|
} |
||||
|
for { |
||||
|
conn, err := listener.AcceptTCP() |
||||
|
if err != nil { |
||||
|
log.Fatal(err) // 错误直接退出
|
||||
|
} |
||||
|
fmt.Println("remote address:", conn.RemoteAddr()) |
||||
|
go echo(conn) |
||||
|
} |
||||
|
} |
@ -0,0 +1,27 @@ |
|||||
|
package main |
||||
|
|
||||
|
import ( |
||||
|
"log" |
||||
|
"net" |
||||
|
"os" |
||||
|
) |
||||
|
|
||||
|
func main() { |
||||
|
if len(os.Args) != 2 { |
||||
|
log.Fatalf("Usage: %s host:port", os.Args[0]) |
||||
|
} |
||||
|
service := os.Args[1] |
||||
|
tcpAddr, err := net.ResolveTCPAddr("tcp4", service) |
||||
|
if err != nil { |
||||
|
log.Fatal(err) |
||||
|
} |
||||
|
conn, err := net.DialTCP("tcp4", nil, tcpAddr) |
||||
|
if err != nil { |
||||
|
log.Fatal(err) |
||||
|
} |
||||
|
n, err := conn.Write([]byte("HEAD / HTTP/1.1\r\n\r\n")) |
||||
|
if err != nil { |
||||
|
log.Fatal(err) |
||||
|
} |
||||
|
log.Fatal(n) |
||||
|
} |
@ -0,0 +1,32 @@ |
|||||
|
package main |
||||
|
|
||||
|
import ( |
||||
|
"fmt" |
||||
|
"net" |
||||
|
"os" |
||||
|
) |
||||
|
|
||||
|
func main() { |
||||
|
if len(os.Args) != 2 { |
||||
|
fmt.Fprintf(os.Stderr, "Usage: %s host:port", os.Args[0]) |
||||
|
os.Exit(1) |
||||
|
} |
||||
|
service := os.Args[1] |
||||
|
udpAddr, err := net.ResolveUDPAddr("udp4", service) |
||||
|
checkError(err) |
||||
|
conn, err := net.DialUDP("udp", nil, udpAddr) |
||||
|
checkError(err) |
||||
|
_, err = conn.Write([]byte("anything")) |
||||
|
checkError(err) |
||||
|
var buf [512]byte |
||||
|
n, err := conn.Read(buf[0:]) |
||||
|
checkError(err) |
||||
|
fmt.Println(string(buf[0:n])) |
||||
|
os.Exit(0) |
||||
|
} |
||||
|
func checkError(err error) { |
||||
|
if err != nil { |
||||
|
fmt.Fprintf(os.Stderr, "Fatal error %s", err.Error()) |
||||
|
os.Exit(1) |
||||
|
} |
||||
|
} |
@ -0,0 +1,31 @@ |
|||||
|
package main |
||||
|
|
||||
|
import ( |
||||
|
"fmt" |
||||
|
"net" |
||||
|
"os" |
||||
|
"time" |
||||
|
) |
||||
|
|
||||
|
func main() { |
||||
|
service := ":8000" |
||||
|
tcpAddr, err := net.ResolveTCPAddr("tcp4", service) |
||||
|
checkError(err) |
||||
|
listener, err := net.ListenTCP("tcp", tcpAddr) |
||||
|
checkError(err) |
||||
|
for { |
||||
|
conn, err := listener.Accept() |
||||
|
if err != nil { |
||||
|
continue |
||||
|
} |
||||
|
daytime := time.Now().String() |
||||
|
conn.Write([]byte(daytime)) // don't care about return value
|
||||
|
conn.Close() // we're finished with this client
|
||||
|
} |
||||
|
} |
||||
|
func checkError(err error) { |
||||
|
if err != nil { |
||||
|
fmt.Fprintf(os.Stderr, "Fatal error: %s", err.Error()) |
||||
|
os.Exit(1) |
||||
|
} |
||||
|
} |
@ -0,0 +1,58 @@ |
|||||
|
package main |
||||
|
|
||||
|
import ( |
||||
|
"fmt" |
||||
|
"net" |
||||
|
"os" |
||||
|
"strconv" |
||||
|
"strings" |
||||
|
"time" |
||||
|
) |
||||
|
|
||||
|
func main() { |
||||
|
service := ":1200" |
||||
|
tcpAddr, err := net.ResolveTCPAddr("tcp4", service) |
||||
|
checkError(err) |
||||
|
listener, err := net.ListenTCP("tcp", tcpAddr) |
||||
|
checkError(err) |
||||
|
for { |
||||
|
conn, err := listener.Accept() |
||||
|
if err != nil { |
||||
|
continue |
||||
|
} |
||||
|
go handleClient(conn) |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
func handleClient(conn net.Conn) { |
||||
|
conn.SetReadDeadline(time.Now().Add(2 * time.Minute)) // set 2 minutes timeout
|
||||
|
request := make([]byte, 128) // set maxium request length to 128B to prevent flood attack
|
||||
|
defer conn.Close() // close connection before exit
|
||||
|
for { |
||||
|
read_len, err := conn.Read(request) |
||||
|
|
||||
|
if err != nil { |
||||
|
fmt.Println(err) |
||||
|
break |
||||
|
} |
||||
|
|
||||
|
if read_len == 0 { |
||||
|
break // connection already closed by client
|
||||
|
} else if strings.TrimSpace(string(request[:read_len])) == "timestamp" { |
||||
|
daytime := strconv.FormatInt(time.Now().Unix(), 10) |
||||
|
conn.Write([]byte(daytime)) |
||||
|
} else { |
||||
|
daytime := time.Now().String() |
||||
|
conn.Write([]byte(daytime)) |
||||
|
} |
||||
|
|
||||
|
request = make([]byte, 128) // clear last read content
|
||||
|
} |
||||
|
} |
||||
|
|
||||
|
func checkError(err error) { |
||||
|
if err != nil { |
||||
|
fmt.Fprintf(os.Stderr, "Fatal error: %s", err.Error()) |
||||
|
os.Exit(1) |
||||
|
} |
||||
|
} |
@ -0,0 +1,32 @@ |
|||||
|
package main |
||||
|
|
||||
|
import ( |
||||
|
"fmt" |
||||
|
"io/ioutil" |
||||
|
"net" |
||||
|
"os" |
||||
|
) |
||||
|
|
||||
|
func main() { |
||||
|
if len(os.Args) != 2 { |
||||
|
fmt.Fprintf(os.Stderr, "Usage: %s host:port ", os.Args[0]) |
||||
|
os.Exit(1) |
||||
|
} |
||||
|
service := os.Args[1] |
||||
|
tcpAddr, err := net.ResolveTCPAddr("tcp4", service) |
||||
|
checkError(err) |
||||
|
conn, err := net.DialTCP("tcp", nil, tcpAddr) |
||||
|
checkError(err) |
||||
|
_, err = conn.Write([]byte("HEAD / HTTP/1.0\r\n\r\n")) |
||||
|
checkError(err) |
||||
|
result, err := ioutil.ReadAll(conn) |
||||
|
checkError(err) |
||||
|
fmt.Println(string(result)) |
||||
|
os.Exit(0) |
||||
|
} |
||||
|
func checkError(err error) { |
||||
|
if err != nil { |
||||
|
fmt.Fprintf(os.Stderr, "Fatal error: %s", err.Error()) |
||||
|
os.Exit(1) |
||||
|
} |
||||
|
} |
Loading…
Reference in new issue