Go socket

130 篇文章 4 订阅
31 篇文章 31 订阅

回显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
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值