golang(4):编写socket服务,简单支持命令
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了golang(4):编写socket服务,简单支持命令,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3189字,纯文字阅读大概需要5分钟。
内容图文
本文的原文连接是: http://blog.csdn.net/freewebsys/article/details/46881213 转载请必须注明出处!
1,socket服务
使用golang开发socket服务还是非常简单的。
socket的库都封装好了。
参考文档:
https://github.com/astaxie/build-web-application-with-golang/blob/master/zh/08.1.md
2,简单例子
package main
import (
"fmt""net""os""time"
)
func main() {
tcpAddr, err := net.ResolveTCPAddr("tcp4", ":8080")
checkError(err)
listener, err := net.ListenTCP("tcp", tcpAddr)
checkError(err)
for {//循环处理
conn, err := listener.Accept()
if err != nil {
continue
}
go handleClient(conn)//创建一个goroutinue处理
}
}
func handleClient(conn net.Conn) {
defer conn.Close()
daytime := time.Now().String()
conn.Write([]byte(daytime)) // don‘t care about return value// we‘re finished with this client
}
func checkError(err error) {
if err != nil {
fmt.Fprintf(os.Stderr, "Fatal error: %s", err.Error())
os.Exit(1)
}
}
通过net.ListenTCP(“tcp”, tcpAddr) 创建一个服务,
然后用for循环,通过listener.Accept() 再创建一个goroutinue处理。
测试,使用telnet测试
$ telnet 127.0.0.18080
Trying 127.0.0.1...
Connected to localhost.
Escape character is ‘^]‘.
2015-07-1417:33:59.602610026 +0800 CSTConnection closed by foreign host.
3,增加交互处理
当客户端输入参数的时候,服务端可以处理。
这里遇到几个问题一个是客户端输入的带回车\r\n要替换掉。
在一个字符串比较用等号即可,但是byte转换字符串长度不一样,需要特殊处理。
package main
import (
"net""os""fmt""time""strings"
)
func main() {
// println(os.Args[0])// println("Hello world!")
tcpAddr , err := net.ResolveTCPAddr("tcp4", ":8080")
checkError(err, 1)
listener , err := net.ListenTCP("tcp", tcpAddr)
checkError(err, 2)
for {
conn, err := listener.Accept()
if err != nil {
continue
}
go handleClient(conn)
}
os.Exit(0)
}
func handleClient(conn net.Conn) {
conn.SetReadDeadline(time.Now().Add(2 * time.Minute)) // 设置两分钟超时。
user_cmd := make([]byte, 128) //设置用户输入的命令defer conn.Close()
for {
read_len, err := conn.Read(user_cmd)
if err != nil {
fmt.Println(err)
break
}
if read_len == 0 {
break// connection already closed by client
}
//fmt.Println(string(user_cmd))//fmt.Println(len(string(user_cmd)))//长度是128,而不是time字符串的长度。//####################需要特殊处理字符串,找到每一个字符,然后累加。####################
cmd_str := ""for i := 0; i < len(user_cmd); i ++ {
//println(cmd_str[i])if user_cmd[i] == 0 {
break
}else {
cmd_str += string(user_cmd[i])
}
}
//替换字符
cmd_str = strings.Replace(cmd_str, "\r\n", "", -1)
if cmd_str == "time" {
time_now := time.Now().String()
conn.Write([]byte(time_now))
}elseif cmd_str == "exit" {//退出命令。
conn.Close()
}
user_cmd = make([]byte, 128) // clear last read content
}
}
func checkError(err error, num int) {
if err != nil {
fmt.Fprintf(os.Stderr, "%d) Fail Error:%s", num, err.Error())
os.Exit(1)
}
}
客户端telnet调用:当输入time返回时间,当输入exit关闭连接。
$ telnet 127.0.0.18080
Trying 127.0.0.1...
Connected to localhost.
Escape character is ‘^]‘.
time
2015-07-1417:44:06.743505631 +0800 CST
exit
Connection closed by foreign host.
4,总结
本文的原文连接是: http://blog.csdn.net/freewebsys/article/details/46881213 转载请必须注明出处!
使用golang开发服务端还是非常方便的。
代码非常简洁,配合上goroutinue就可以写出高效的服务端代码。
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文:http://blog.csdn.net/freewebsys/article/details/46881213
内容总结
以上是互联网集市为您收集整理的golang(4):编写socket服务,简单支持命令全部内容,希望文章能够帮你解决golang(4):编写socket服务,简单支持命令所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。