我有这样一个需求,有A,B两台服务器,A服务器会不停的往B服务器发送大量大小不固定的文件。为防止并发过高将服务器端口占完,所有采用tcp长连接。A服务器通过tcp连接B服务器,然后不停的往B服务器发送大量文件。
现在出现了这么个问题,我同时发送大量文件的时候所有的文件被写入进了1个文件当中。
代码如下:
发送端:
package main
import (
"fmt"
"io/ioutil"
"log"
"net"
)
func main() {
conn, err := net.Dial("tcp", ":9900")
if err != nil {
log.Printf("%+v\n", err)
return
}
var num = 1
for {
if num > 2 {
break
}
fname := fmt.Sprintf("./file/%d.jpg", 7)
b, err := ioutil.ReadFile(fname)
if err != nil {
log.Printf("%+v\n", err)
return
}
conn.Write(b)
num += 1
}
}
接收端:
package main
import (
"fmt"
"log"
"net"
"os"
"sync"
)
func main() {
listen, err := net.Listen("tcp", ":9900")
if err != nil {
log.Printf("%+v\n", err)
return
}
for {
conn, err := listen.Accept()
if err != nil {
log.Printf("%+v\n", err)
return
}
go handler(conn)
}
}
func handler(conn net.Conn) {
defer conn.Close()
for {
var buffer = make([]byte, 1024)
n, err := conn.Read(buffer)
if err != nil {
log.Printf("%+v\n", err)
return
}
if n > 0 {
fname := fmt.Sprintf("./tmp/%d.jpg", fname())
f, err := os.OpenFile(fname, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0777)
if err != nil {
log.Printf("%+v\n", err)
return
}
f.Write(buffer[:n])
log.Println("n:", n)
for {
var buf = make([]byte, 1024)
n, err := conn.Read(buf)
if err != nil {
log.Printf("%+v\n", err)
return
}
log.Println("n:", n)
f.Write(buf[:n])
if n != (1024) {
log.Println(fname, "写入完成")
f.Close()
break
}
}
}
}
}
var fn = 1
func fname() int {
wd := sync.Mutex{}
wd.Lock()
n := fn + 1
wd.Unlock()
return n
}