设为首页 收藏本站
查看: 574|回复: 0

[经验分享] Go语言实现的简单TCP服务及使用MySql

[复制链接]

尚未签到

发表于 2015-6-19 09:37:02 | 显示全部楼层 |阅读模式
  转自: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

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-78763-1-1.html 上篇帖子: 手动配置windows7+nginx+php+mysql+apache服务器 下篇帖子: MySQL使用JDBC Load Data InFile导入数据注意事项
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表