Server
Server.gopackage main//Server-side import ("Bufio" "FMT" "Log" "NET"///Support Communication package "StrConv" "strings")//Start server fun C StartServer () {fmt. Println ("Launching Server ...")//Connect host, port, TCP communication, 9183 port listener, err: = Net. Listen ("TCP", "0.0.0.0:9183") checkerror (Err) fmt. Println ("Launching Success!") For {//wait for Client Access conn, err: = Listener. Accept () checkerror (ERR)//Open a Goroutines processing client message, this is the Golang feature, implementation concurrency just go a bit better go Doserverstuff (conn)}} Handles client message func DOSERVERSTUFF (conn net. Conn) {//nameinfo: = make ([]byte, 20)//Generate a cache array//_, err: = Conn. Read (Nameinfo)//name, _: = Bufio. Newreader (conn). ReadString (' \ n ')//name = strings. Trim (name, "\ r \ n") Name: = ""//fmt. Println ("Welcome" + string (name) + "Connect success!") Print out Kstep: = 0 for {message, _: = Bufio. Newreader (conn). ReadString (' \ n ') if message = = "" {fmt. Printf ("#####%s" SEND%d Data, It is already out!!! \ n ", name, Kstep) return} FLAG1: = "[send" + StrConv. Itoa (Kstep) + "]" Flag2: = "[recv" + StrConv. Itoa (Kstep) + "]" if strings. Contains (Message, "#") {name = strings. Trim (Message, "\ r \ n") fmt. Println ("Welcome" + string (name) + "Connect success!") Conn. Write ([]byte ("Welcome" + string (name) + "Connect success!" + "\ n")})} else if strings. Contains (message, Flag1) {//fmt. Printf ("[Normal output] Received from%s:%s", string (name), string (message)) Newmessage: = Strings. ToUpper (MESSAGE) Conn. Write ([]byte (Flag2 + newmessage + "\ n")) kstep++} else {fmt. Printf ("[Problem output] Received from%s:%s", string (name), string (message)}}}//check error func checkerror (err error) int { If err! = Nil {if Err. Error () = = "EOF" {//fmt. Println ("User exited") return 0} log. Fatal ("An error!", err. Error ()) return-1} return 1}func main () { StartServer ()}
Client
Package main//Client Import ("Bufio" "bytes" "FMT" "Log" "Net" "StrConv" "Strings" "Sync" "Time") v AR gosum int = 10//number of threads var maxstep int = 100//single thread transfer number var Len int = 100//Transmit Data unit length multiple var wg sync. waitgroup//Connection Server func connectserver (conn net. CONN, Ind int) {Name: = "LS118. ZW Thread "+ StrConv. ITOA (Ind) FMT. Printf ("%s Connect success! \ n ", name) FMT. fprintf (Conn, "#" +name+ "\ n") message, _: = Bufio. Newreader (conn). ReadString (' \ n ') if strings. Contains (Message, "#") {FMT. Printf ("%s already send name info!!! \ n ", name)} Kstep: = 0 for {if Kstep = = maxstep {Conn. Close () defer WG. Done () return} FLAG1: = "[send" + StrConv. Itoa (Kstep) + "]" Flag2: = "[recv" + StrConv. Itoa (Kstep) + "]"//fmt. Printf ("%s send:", name) var buffer bytes. Buffer buffer. WriteString ("Data:") for I: = 1; I <= Len; i++ {buffer. WriteString ("Heelo_world") } Text: = buffer. String () Text = Flag1 + text//fmt. Println (text) fmt. fprintf (conn, text+ "\ n") message, _: = Bufio. Newreader (conn). ReadString (' \ n ') if strings. Contains (message, Flag2) {//fmt. Print ("Message from Server:" + message) kstep++} else {fmt. Print ("[ERROR]: \ n" + Message)}}//defer WG. Done ()}//check error func checkerror (err error) {if err! = Nil {log. Fatal ("An error!", err. Error ())}}//main function func main () {t1: = time. Now () for I: = 0; i < gosum; i++ {conn, err: = Net. Dial ("TCP", "0.0.0.0:9183") checkerror (ERR) WG. ADD (1) Go ConnectServer (conn, i) defer Conn. Close ()} WG. Wait () T2: = time. Now () Fmt. Printf ("Start Time:") fmt. PRINTLN (t1) fmt. Printf ("End Time:") fmt. Println (T2) fmt. Printf ("Execute Time:") fmt. Println (T2. Sub (t1)) fmt. Printf ("all goroutine already done!!! \ n ")}