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语言web简单配置
- Go语言实现的一个简单Web服务器
- Go语言的基准测试简单示例
- Go语言简单实现FTP协议.
- go语言编写,简单聊天室程序 1
- go语言简单教程
- 利用 Go 语言编写一个简单的 WebSocket 推送服务
- go语言使用go-sciter创建桌面应用(一) 简单的通过html,css写ui
- Go语言ssh简单的使用
- Go语言实现简单的一个静态WEB服务器
- Go语言实现简单留言板的方法
- Go语言简单源代码剖析
- Go语言最简单的tcp server/client
- 实现一个go语言的简单爬虫来爬取CSDN博文(一)
- Go Web编程(Go语言性能好、语法简单、开发效率高!)
- go语言创建web服务器(简单方便)
- 基于GO语言最简单的HTTP服务器
- GO语言的一些简单数据类型之间相互转换
- 简单了解Go语言中函数作为值以及函数闭包的使用
- GO语言实现的简单“木马”小程序