您的位置:首页 > 编程语言 > Go语言

Go语言 简单的的socket文件传输

2013-07-12 15:39 232 查看
学Go语言一周了,部门老大又让做其它语言,随便写个Go的文件传输例子,主要是用了net包,里边还有各种不规范,请包涵。服务端和客户端都写在main()里了,TCP监听ip和端口,接收文件保存路径什么都可以根据自己的情况改动,详见以下代码:
package mainimport ("bufio""code.google.com/p/mahonia""fmt""io""net""os")func main() {fmt.Println("create a server or client?")reader := bufio.NewReader(os.Stdin)input, _, _ := reader.ReadLine()if string(input) == "server" {Server()}if string(input) == "client" {Client()} else {fmt.Println(Show("err arguments,entering again!.\r\n  alternaltive argument is server or client"))os.Exit(0)}}func Show(s string) string {enc := mahonia.NewEncoder("gbk") //中文转码有错误的函数。return enc.ConvertString(s)}func Server() {exit := make(chan bool)ip := net.ParseIP("127.0.0.1")addr := net.TCPAddr{ip, 8888, ""}go func() {listener, err := net.ListenTCP("tcp", &addr) //TCPListener listenif err != nil {fmt.Println("Initialize error", err.Error())exit <- truereturn}fmt.Println("Server listening...")tcpcon, err := listener.AcceptTCP() //TCPConn clientif err != nil {fmt.Println(err.Error())//continue}fmt.Println("Client connect")data := make([]byte, 1024)if err != nil {fmt.Println("tcpcon.Read(data)" + err.Error())}//recv file namewc, err := tcpcon.Read(data)fo, err := os.Create("F:\\uploads\\" + string(data[0:wc]))if err != nil {fmt.Println("os.Create" + err.Error())}fmt.Println("the file's name is:", string(data[0:wc]))//recb file sizewc, err = tcpcon.Read(data)fmt.Println("the file's size is:", string(data[0:wc]))defer fo.Close()for {c, err := tcpcon.Read(data) //???为何调用conn类的Readif err != nil {fmt.Println("tcpcon.Read(data)" + err.Error())}if string(data[0:c]) == "filerecvend" {fmt.Println("string(data[0:c]) == filerecvend is true")tcpcon.Write([]byte("file recv finished!\r\n"))tcpcon.Close()break}//write to the file_, err = fo.Write(data[0:c])if err != nil {fmt.Println("write err" + err.Error())}}}()<-exitfmt.Println(Show("server close!"))}func Client() {fmt.Println("send ur file to the destination", "input ur filename:")reader := bufio.NewReader(os.Stdin)input, _, _ := reader.ReadLine()fmt.Println(string(input))fi, err := os.Open(string(input))if err != nil {panic(err)}defer fi.Close()fiinfo, err := fi.Stat()fmt.Println("the size of file is ", fiinfo.Size(), "bytes") //fiinfo.Size() return int64 typeconn, err := net.Dial("tcp", "127.0.0.1:8888")if err != nil {fmt.Println(Show("connect server fail!"), Show(err.Error()))return}defer conn.Close()//send filename_, err = conn.Write(input)if err != nil {fmt.Println("conn.Write", err.Error())}//send file size_, err = conn.Write([]byte(string(fiinfo.Size())))if err != nil {fmt.Println("conn.Write", err.Error())}buff := make([]byte, 1024)for {n, err := fi.Read(buff)if err != nil && err != io.EOF {panic(err)}if n == 0 {conn.Write([]byte("filerecvend"))fmt.Println("filerecvend")break}_, err = conn.Write(buff)if err != nil {fmt.Println(err.Error())}}}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  GO语言