回显1
echoServer1.go
package main
import (
"bytes"
"encoding/binary"
"fmt"
"log"
"net"
"unsafe"
)
func main() {
server, err := net.Listen("tcp", "127.0.0.1:8088")
if err != nil {
log.Fatal(err)
}
defer server.Close()
for {
conn, err := server.Accept()
if err != nil {
fmt.Println(err)
continue
}
go handleConnection(conn)
}
}
func handleConnection(conn net.Conn) {
name := conn.RemoteAddr().String()
fmt.Printf("%s: Enter\n", name)
defer func() {
conn.Close()
fmt.Printf("%s: Leave\n", name)
}()
for {
buf, err := Read_Conn(conn)
if err != nil {
fmt.Println(err)
return
}
err = Write_Conn(conn, buf)
if err != nil {
fmt.Println(err)
return
}
fmt.Printf("%s: %s\n", name, string(buf))
}
}
func IntToBytes(n int) []byte {
bytebuf := bytes.NewBuffer([]byte{})
binary.Write(bytebuf, binary.BigEndian, int64(n))
return bytebuf.Bytes()
}
func BytesToInt(bys []byte) int {
bytebuff := bytes.NewBuffer(bys)
var data int64
binary.Read(bytebuff, binary.BigEndian, &data)
return int(data)
}
func Write_byte(conn net.Conn, buf []byte) error {
number := len(buf)
n := 0
for n < number {
write_number, err := conn.Write(buf[n:])
if err != nil {
return err
}
n += write_number
}
return nil
}
func Read_byte(conn net.Conn, number int) ([]byte, error) {
buf := make([]byte, number)
n := 0
for n < number {
read_number, err := conn.Read(buf[n:])
if err != nil {
return nil, err
}
n += read_number
}
return buf, nil
}
func Write_Conn(conn net.Conn, buf []byte) (err error) {
err = Write_byte(conn, IntToBytes(len(buf)))
if err != nil {
return err
}
err = Write_byte(conn, buf)
if err != nil {
return err
}
return nil
}
func Read_Conn(conn net.Conn) (buf []byte, err error) {
buf, err = Read_byte(conn, int(unsafe.Sizeof(8)))
if err != nil {
return nil, err
}
buf, err = Read_byte(conn, BytesToInt(buf))
if err != nil {
return nil, err
}
return buf, nil
}
echoClient1.go
package main
import (
"bufio"
"bytes"
"encoding/binary"
"fmt"
"net"
"os"
"strings"
"unsafe"
)
func main() {
conn, err := net.Dial("tcp", "localhost:8088")
if err != nil {
fmt.Println(err)
return
}
defer conn.Close()
reader := bufio.NewReader(os.Stdin)
for {
fmt.Print("<<<")
str, err := reader.ReadString('\n')
if err != nil {
fmt.Println(err)
return
}
str = strings.TrimSpace(str)
str = strings.ToLower(str)
if str == "" {
continue
}
if str == "quit" || str == "exit" {
break
}
err = Write_Conn(conn, []byte(str))
if err != nil {
fmt.Println(err)
return
}
buf, err := Read_Conn(conn)
if err != nil {
fmt.Println(err)
return
}
fmt.Printf(">>>%s\n", string(buf))
}
}
func IntToBytes(n int) []byte {
bytebuf := bytes.NewBuffer([]byte{})
binary.Write(bytebuf, binary.BigEndian, int64(n))
return bytebuf.Bytes()
}
func BytesToInt(bys []byte) int {
bytebuff := bytes.NewBuffer(bys)
var data int64
binary.Read(bytebuff, binary.BigEndian, &data)
return int(data)
}
func Write_byte(conn net.Conn, buf []byte) error {
number := len(buf)
n := 0
for n < number {
write_number, err := conn.Write(buf[n:])
if err != nil {
return err
}
n += write_number
}
return nil
}
func Read_byte(conn net.Conn, number int) ([]byte, error) {
buf := make([]byte, number)
n := 0
for n < number {
read_number, err := conn.Read(buf[n:])
if err != nil {
return nil, err
}
n += read_number
}
return buf, nil
}
func Write_Conn(conn net.Conn, buf []byte) (err error) {
err = Write_byte(conn, IntToBytes(len(buf)))
if err != nil {
return err
}
err = Write_byte(conn, buf)
if err != nil {
return err
}
return nil
}
func Read_Conn(conn net.Conn) (buf []byte, err error) {
buf, err = Read_byte(conn, int(unsafe.Sizeof(8)))
if err != nil {
return nil, err
}
buf, err = Read_byte(conn, BytesToInt(buf))
if err != nil {
return nil, err
}
return buf, nil
}
回显2
echoServer2.go
package main
import (
"fmt"
"net"
"time"
)
func main() {
server, err := net.Listen("tcp", "127.0.0.1:8086")
if err != nil {
fmt.Println(err)
return
}
defer server.Close()
for {
conn, err := server.Accept()
if err != nil {
fmt.Println(err)
continue
}
go handelConn(conn)
}
}
func handelConn(conn net.Conn) {
var number int
var err error
var name string
var msg string
name = conn.RemoteAddr().String()
msg = fmt.Sprintf("%s\n\t%s: %s",
time.Now().Format("2006-01-02 15:04:05"), name, "Enter")
fmt.Println(msg)
defer func() {
conn.Close()
fmt.Println(err)
msg = fmt.Sprintf("%s\n\t%s: %s",
time.Now().Format("2006-01-02 15:04:05"), name, "Leave")
fmt.Println(msg)
}()
buf := make([]byte, 1024)
for {
number, err = conn.Read(buf)
if err != nil {
return
}
err = Write_byte(conn, buf[:number])
if err != nil {
return
}
msg = fmt.Sprintf("%s\n\t%s: %s",
time.Now().Format("2006-01-02 15:04:05"), name, string(buf[:number]))
fmt.Println(msg)
}
}
func Write_byte(conn net.Conn, buf []byte) error {
number := len(buf)
n := 0
for n < number {
write_number, err := conn.Write(buf[n:])
if err != nil {
return err
}
n += write_number
}
return nil
}
echoClient2.go
package main
import (
"bufio"
"fmt"
"net"
"os"
)
func main() {
conn, err := net.Dial("tcp", "127.0.0.1:8086")
if err != nil {
fmt.Println(err)
return
}
defer conn.Close()
reader := bufio.NewReader(os.Stdin)
for {
str := ""
fmt.Print("<<<")
fmt.Fscanln(reader, &str)
if str == "" {
continue
}
if str == "quit" || str == "exit" {
break
}
buf := []byte(str)
err := Write_byte(conn, buf)
if err != nil {
fmt.Println(err)
return
}
buf, err = Read_byte(conn, len(buf))
if err != nil {
fmt.Println(err)
return
}
fmt.Printf(">>>%s\n", string(buf))
}
}
func Write_byte(conn net.Conn, buf []byte) error {
number := len(buf)
n := 0
for n < number {
write_number, err := conn.Write(buf[n:])
if err != nil {
return err
}
n += write_number
}
return nil
}
func Read_byte(conn net.Conn, number int) ([]byte, error) {
buf := make([]byte, number)
n := 0
for n < number {
read_number, err := conn.Read(buf[n:])
if err != nil {
return nil, err
}
n += read_number
}
return buf, nil
}
回显3
echoServer3.go
package main
import (
"fmt"
"net"
"time"
)
func main() {
server, err := net.Listen("tcp", "127.0.0.1:8086")
if err != nil {
fmt.Println(err)
return
}
defer server.Close()
for {
conn, err := server.Accept()
if err != nil {
fmt.Println(err)
continue
}
go handelConn(conn)
}
}
func handelConn(conn net.Conn) {
var name string
var msg string
name = conn.RemoteAddr().String()
msg = fmt.Sprintf("%s\n\t%s: %s",
time.Now().Format("2006-01-02 15:04:05"), name, "Enter")
fmt.Println(msg)
defer func() {
conn.Close()
msg = fmt.Sprintf("%s\n\t%s: %s",
time.Now().Format("2006-01-02 15:04:05"), name, "Leave")
fmt.Println(msg)
}()
done := make(chan interface{})
defer close(done)
byteStream := Read_conn(done, conn)
loop:
for {
select {
case buf, ok := <-byteStream:
if !ok {
return
} else {
if Write_byte(conn, buf) != nil {
return
}
msg = fmt.Sprintf("%s\n\t%s: %s",
time.Now().Format("2006-01-02 15:04:05"), name, string(buf))
fmt.Println(msg)
}
case <-time.After(1 * time.Minute):
break loop
}
}
}
func Read_conn(done chan interface{}, conn net.Conn) (_ <-chan []byte) {
byteStream := make(chan []byte)
go func() {
defer close(byteStream)
buf := make([]byte, 1024)
for {
select {
case <-done:
return
default:
number, err := conn.Read(buf)
if err != nil {
return
}
byteStream <- buf[:number]
}
}
}()
return byteStream
}
func Write_byte(conn net.Conn, buf []byte) error {
number := len(buf)
n := 0
for n < number {
write_number, err := conn.Write(buf[n:])
if err != nil {
return err
}
n += write_number
}
return nil
}
echoClient3.go
package main
import (
"bufio"
"fmt"
"net"
"os"
"time"
"strings"
)
func main() {
conn, err := net.Dial("tcp", "127.0.0.1:8086")
if err != nil {
fmt.Println(err)
return
}
defer conn.Close()
done := make(chan interface{})
defer close(done)
strStream, orderStream := Read_stdin(done)
loop:
for {
select {
case str, ok := <-strStream:
if !ok {
break loop
} else {
buf := []byte(str)
err := Write_byte(conn, buf)
if err != nil {
return
}
buf, err = Read_byte(conn, len(buf))
if err != nil {
return
}
fmt.Printf(">>>%s\n", string(buf))
<-orderStream
}
case <-time.After(30 * time.Second):
break loop
}
}
}
func Read_stdin(done chan interface{}) (_ <-chan string, _ chan interface{}) {
strStream := make(chan string)
orderStream := make(chan interface{})
go func() {
defer close(strStream)
defer close(orderStream)
reader := bufio.NewReader(os.Stdin)
for {
select {
case <-done:
return
default:
fmt.Printf("<<<")
str, err := reader.ReadString('\n')
if err != nil {
return
}
str = strings.TrimSpace(str)
if str == "" {
continue
}
if str == "quit" || str == "exit" {
return
}
strStream <- str
orderStream <- struct{}{}
}
}
}()
return strStream, orderStream
}
func Write_byte(conn net.Conn, buf []byte) error {
number := len(buf)
n := 0
for n < number {
write_number, err := conn.Write(buf[n:])
if err != nil {
return err
}
n += write_number
}
return nil
}
func Read_byte(conn net.Conn, number int) ([]byte, error) {
buf := make([]byte, number)
n := 0
for n < number {
read_number, err := conn.Read(buf[n:])
if err != nil {
return nil, err
}
n += read_number
}
return buf, nil
}
聊天1
chatServer1.go
package main
import (
"fmt"
"net"
"time"
)
var conns []net.Conn
func main() {
server, err := net.Listen("tcp", "127.0.0.1:8086")
if err != nil {
fmt.Println(err)
return
}
defer server.Close()
for {
conn, err := server.Accept()
if err != nil {
fmt.Println(err)
continue
}
go handelConn(conn)
}
}
func handelConn(conn net.Conn) {
if Write_conns(conns, conn, []byte("Enter")) != nil {
return
}
conns = append(conns, conn)
defer func() {
j := 0
for _, c := range conns {
if c != conn {
conns[j] = c
j++
}
}
conns = conns[:j]
conn.Close()
if Write_conns(conns, conn, []byte("Leave")) != nil {
return
}
}()
done := make(chan interface{})
defer close(done)
byteStream := Read_conn(done, conn)
loop:
for {
select {
case buf, ok := <-byteStream:
if !ok {
return
} else {
if Write_conns(conns, conn, buf) != nil {
return
}
}
case <-time.After(1 * time.Minute):
break loop
}
}
}
func Read_conn(done chan interface{}, conn net.Conn) (_ <-chan []byte) {
byteStream := make(chan []byte, 10)
go func() {
defer close(byteStream)
buf := make([]byte, 1024)
for {
select {
case <-done:
return
default:
number, err := conn.Read(buf)
if err != nil {
return
}
byteStream <- buf[:number]
}
}
}()
return byteStream
}
func Write_conns(conns []net.Conn, conn net.Conn, buf []byte) (err error){
name := conn.RemoteAddr().String()
msg := fmt.Sprintf("%s\n\t%s: %s",
time.Now().Format("2006-01-02 15:04:05"), name, string(buf))
for _, c := range conns {
if c != conn {
err = Write_byte(c, []byte(msg))
if err != nil {
return err
}
} else {
err = Write_byte(c, buf)
if err != nil {
return err
}
}
}
fmt.Println(msg)
return nil
}
func Write_byte(conn net.Conn, buf []byte) error {
number := len(buf)
n := 0
for n < number {
write_number, err := conn.Write(buf[n:])
if err != nil {
return err
}
n += write_number
}
return nil
}
chatClient1.go
package main
import (
"bufio"
"fmt"
"net"
"os"
"strings"
"time"
)
func main() {
conn, err := net.Dial("tcp", "127.0.0.1:8086")
if err != nil {
fmt.Println(err)
return
}
defer conn.Close()
done := make(chan interface{})
defer close(done)
strStream := Read_stdin(done)
byteStream := Read_conn(done, conn)
loop:
for {
select {
case str, ok := <-strStream:
if !ok {
break loop
} else {
err := Write_byte(conn, []byte(str))
if err != nil {
return
}
}
case buf, ok := <-byteStream:
if !ok {
break loop
} else {
fmt.Println(string(buf))
}
case <-time.After(30 * time.Second):
break loop
}
}
}
func Read_stdin(done chan interface{}) <-chan string {
strStream := make(chan string, 10)
go func() {
defer close(strStream)
reader := bufio.NewReader(os.Stdin)
for {
select {
case <-done:
return
default:
str, err := reader.ReadString('\n')
if err != nil {
return
}
str = strings.TrimSpace(str)
if str == "" {
continue
}
if str == "quit" || str == "exit" {
return
}
strStream <- str
}
}
}()
return strStream
}
func Read_conn(done chan interface{}, conn net.Conn) <-chan []byte {
byteStream := make(chan []byte, 10)
go func() {
defer close(byteStream)
buf := make([]byte, 1024)
for {
select {
case <-done:
return
default:
n, err := conn.Read(buf)
if err != nil {
return
}
byteStream <- buf[:n]
}
}
}()
return byteStream
}
func Write_byte(conn net.Conn, buf []byte) error {
number := len(buf)
n := 0
for n < number {
write_number, err := conn.Write(buf[n:])
if err != nil {
return err
}
n += write_number
}
return nil
}
func Read_byte(conn net.Conn, number int) ([]byte, error) {
buf := make([]byte, number)
n := 0
for n < number {
read_number, err := conn.Read(buf[n:])
if err != nil {
return nil, err
}
n += read_number
}
return buf, nil
}
ftp
ftpClient1.go
package main
import (
"bufio"
"fmt"
"net"
"os"
"strings"
"time"
"path/filepath"
"io/ioutil"
)
var cur_path string
func init() {
cur_path, _ = os.Getwd()
}
func main() {
conn, err := net.Dial("tcp", "127.0.0.1:8086")
if err != nil {
fmt.Println(err)
return
}
defer conn.Close()
done := make(chan interface{})
defer close(done)
strStream, orderStream := Read_stdin(done)
loop:
for {
select {
case str, ok := <-strStream:
if !ok {
break loop
} else {
err := Write_byte(conn, []byte(str))
if err != nil {
return
}
buf := make([]byte, 1024)
n, err := conn.Read(buf)
if err != nil {
return
}
fmt.Println(string(buf[:n]))
<-orderStream
}
case <-time.After(30 * time.Second):
break loop
}
}
}
func Read_stdin(done chan interface{}) (_ <-chan string, _ <-chan interface{}){
strStream := make(chan string)
orderStream := make(chan interface{})
go func() {
defer close(strStream)
defer close(orderStream)
reader := bufio.NewReader(os.Stdin)
for {
select {
case <-done:
return
default:
fmt.Print("ftp> ")
str, err := reader.ReadString('\n')
if err != nil {
return
}
str = strings.TrimSpace(str)
if str == "" {
continue
}
if str == "quit" || str == "exit" {
return
}
if str == "pwd" || str == "cd" || str == "cd ." {
fmt.Println(cur_path)
files, err := ioutil.ReadDir(cur_path)
if err != nil {
return
}
for _, file := range files {
fmt.Printf("%T\n", file)
fmt.Println("size=", file.Size())
fmt.Println("Mode=", file.Mode())
fmt.Println("ModTime=", file.ModTime())
fmt.Println("IsDir=", file.IsDir())
fmt.Println("Sys=", file.Sys())
fmt.Printf("\t%s\n", file.Name())
}
continue
}
if str == "cd .." {
cur_path = filepath.Dir(cur_path)
fmt.Println(cur_path)
files, err := ioutil.ReadDir(cur_path)
if err != nil {
return
}
for _, file := range files {
fmt.Printf("\t%s\n", file.Name())
}
continue
}
strStream <- str
orderStream <- struct{}{}
}
}
}()
return strStream, orderStream
}
func Write_byte(conn net.Conn, buf []byte) error {
number := len(buf)
n := 0
for n < number {
write_number, err := conn.Write(buf[n:])
if err != nil {
return err
}
n += write_number
}
return nil
}
func Read_byte(conn net.Conn, number int) ([]byte, error) {
buf := make([]byte, number)
n := 0
for n < number {
read_number, err := conn.Read(buf[n:])
if err != nil {
return nil, err
}
n += read_number
}
return buf, nil
}
func GetAllFiles(dirPth string) (files []string, err error) {
fis, err := ioutil.ReadDir(filepath.Clean(filepath.ToSlash(dirPth)))
if err != nil {
return nil, err
}
for _, f := range fis {
_path := filepath.Join(dirPth, f.Name())
if f.IsDir() {
fs, _ := GetAllFiles(_path)
files = append(files, fs...)
continue
}
switch filepath.Ext(f.Name()) {
case ".png", ".jpg":
files = append(files, _path)
}
}
return files, nil
}