|
|
转自:http://www.sharejs.com/codes/go/5997
http://www.sharejs.com/codes/go/4363
1、GO语言实现的简单TCP服务代码
package main
import (
"net"
"fmt"
)
var (
maxRead = 1100
msgStop = []byte("cmdStop")
msgStart = []byte("cmdContinue")
)
func main() {
hostAndPort := "localhost:54321"
listener := initServer(hostAndPort)
for {
conn, err := listener.Accept()
checkError(err, "Accept: ")
go connectionHandler(conn)
}
}
func initServer(hostAndPort string) *net.TCPListener {
serverAddr, err := net.ResolveTCPAddr("tcp", hostAndPort)
checkError(err, "Resolving address:port failed: '" + hostAndPort + "'")
listener, err := net.ListenTCP("tcp", serverAddr)
checkError(err, "ListenTCP: ")
println("Listening to: ", listener.Addr().String())
return listener
}
func connectionHandler(conn net.Conn) {
connFrom := conn.RemoteAddr().String()
println("Connection from: ", connFrom)
talktoclients(conn)
for {
var ibuf []byte = make([]byte, maxRead + 1)
length, err := conn.Read(ibuf[0:maxRead])
ibuf[maxRead] = 0 // to prevent overflow
switch err {
case nil:
handleMsg(length, err, ibuf)
default:
goto DISCONNECT
}
}
DISCONNECT:
err := conn.Close()
println("Closed connection:" , connFrom)
checkError(err, "Close:" )
}
func talktoclients(to net.Conn) {
wrote, err := to.Write(msgStart)
checkError(err, "Write: wrote " + string(wrote) + " bytes.")
}
func handleMsg(length int, err error, msg []byte) {
if length > 0 {
for i := 0; ; i++ {
if msg == 0 {
break
}
}
fmt.Printf("Received data: %v", string(msg[0:length]))
fmt.Println(" length:",length)
}
}
func checkError(error error, info string) {
if error != nil {
panic("ERROR: " + info + " " + error.Error()) // terminate program
}
}
例2 、
下面先创建一个简单的Server端:
package main
import (
"net"
"fmt"
)
func main() {
if ln, err := net.Listen("tcp", ":8080"); err == nil {
defer ln.Close()
for{
ln.Accept()
fmt.Println("Receive a Message")
}
}
}
和脚本一样简单的写法。
先net.Listen(), 第一个参数是协议,tcp还是udp,第二个参数是ip地址,这里可以不填写IP只填写端口就是
使用defer 来Close,将close写在listen之后是个好习惯
然后再循环中使用Accept()接受消息
下面是一个可以进行压力测试的客户端程序
package main
import (
"net"
"fmt"
)
func main() {
currency := 20 //并发数,记住,一个连接数是打开一个端口号,window和linux的端口号都是有限制的
count := 10 //每条连接发送多少次连接
for i:=0;i |
|
|