Go语言网络通信---TCP通信上传一个小文件

server:

package main

import (
	"fmt"
	"net"
	"os"
)

func SHandleError(err error, when string)  {
	if err != nil{
		fmt.Println("服务端异常退出,err=", err, when)
		os.Exit(1)
	}
}

func main() {
	//建立tcp监听
	listener, e := net.Listen("tcp", ":8080")
	SHandleError(e, "net.Listen")
	defer func() {
		listener.Close()
		fmt.Println("服务端正常退出")
	}()

	//接受客户端请求,建立会话专线Conn
	conn, e := listener.Accept()
	SHandleError(e, "listener.Accept")
	defer func() {
		conn.Close()
		fmt.Printf("已断开与%v的链接\n", conn.RemoteAddr())
	}()

	dstFile, e := os.OpenFile(`meinv1.mp4`, os.O_CREATE|os.O_WRONLY|os.O_TRUNC, 0666)
	for {
		//接受客户端上传的文件
		buffer := make([]byte, 100)
		n, e := conn.Read(buffer)
		SHandleError(e, "conn.Read")

		//写入服务端本地文件
		dstFile.Write(buffer[:n])
		fmt.Printf("成功写入%d个字节\n", n)

		//如果本次接受的数据没有填满一个缓冲区,说明数据已经接受完毕
		if n < 100{
			fmt.Println("文件接受成功")
			dstFile.Close()

			//回复客户端已收到文件
			conn.Write([]byte("文件接受成功"))
			break
		}
	}



}

  client:

package main

import (
	"fmt"
	"io/ioutil"
	"net"
	"os"
)

/*
·实现tcp文件上传功能
*/

func CHandleError(err error,when string)  {
	if err != nil{
		fmt.Println("客户端异常退出:err=", err, when)
		os.Exit(1)
	}
}

func main() {
	conn, e := net.Dial("tcp", "127.0.0.1:8080")
	CHandleError(e, "net.Dial")

	defer func() {
		conn.Close()
		fmt.Println("客户端正常退出")
	}()

	bytes, e := ioutil.ReadFile(`preview.jpg`)
	CHandleError(e, "ioutil.ReadFile")
	_, e = conn.Write(bytes)
	CHandleError(e, "conn.Write")

	buffer := make([]byte, 1024)
	n, e := conn.Read(buffer)
	CHandleError(e, "conn.Read")
	replyMsg := buffer[:n]
	fmt.Println("服务端:", string(replyMsg))
}

  

posted @ 2020-04-19 22:09  Ethan_Cheng  阅读(336)  评论(0编辑  收藏  举报