golang(4):编写socket服务,简单支持命令

本文的原文连接是: 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.1 8080
Trying 127.0.0.1...
Connected to localhost.
Escape character is ‘^]‘.
2015-07-14 17: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))
        }else if 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.1 8080
Trying 127.0.0.1...
Connected to localhost.
Escape character is ‘^]‘.
time
2015-07-14 17:44:06.743505631 +0800 CST
exit
Connection closed by foreign host.

4,总结

本文的原文连接是: http://blog.csdn.net/freewebsys/article/details/46881213 转载请必须注明出处!

使用golang开发服务端还是非常方便的。

代码非常简洁,配合上goroutinue就可以写出高效的服务端代码。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-05 04:40:23

golang(4):编写socket服务,简单支持命令的相关文章

Python使用TCPServer编写(多线程)Socket服务

SocketServer包对socket包进行了包装(封装),使得创建socket服务非常简单. TCPServer+BaseRequestHandler 使用TCPServer和BaseRequestHandler编写socket服务的样例. #-*- coding:utf-8 -*- from SocketServer import TCPServer, BaseRequestHandler import traceback class MyBaseRequestHandlerr(BaseR

怎样编写支持命令行选项的程序

Linux下的程序,常常支持N多的命令行选项.那么,我们怎样编写支持命令行选项的程序呢. 以下给出两个演示样例. 演示样例1,简单的命令行选项. 以下的程序,支持4个选项, -i,-n,-s,-d 编译后,能够这样运行 (选项之间的顺序无所谓): ./a.out   -i  -n 100  -s hahaha  -d 好了,以下是代码. #include <stdio.h> #include <unistd.h> #include <stdlib.h> int enab

如何编写支持命令行选项的程序

Linux下的程序,经常支持N多的命令行选项.那么,我们如何编写支持命令行选项的程序呢. 下面给出两个示例. 示例1,简单的命令行选项. 下面的程序,支持4个选项, -i,-n,-s,-d 编译后,可以这样执行 (选项之间的顺序无所谓): ./a.out   -i  -n 100  -s hahaha  -d 好了,下面是代码. #include <stdio.h> #include <unistd.h> #include <stdlib.h> int enable_o

运维程序】简单的命令控制器(支持定时命令执行、重复定时任务命令和进程管理,开发这个小程序主要是为了方便管理服务进程)【个人github项目】

一.前言: command-controller 一个运维程序,简单的命令控制器(支持定时命令执行和重复定时命令,开发这个程序主要是为了方便管理服务进程) 本来是要用python做的,但是之前做ffmpeg的时候已经写了一部分Java的命令控制功能了,有些代码就拿过来改改用了(其实是为了偷懒qaq) 二.实现功能 1.进程管理 只支持本程序启动的进程管理,本程序主要功能是定时执行某些脚本或者系统命令,当然命令行和脚本是很自由的,更多用法请自行探索 2.定时命令.任务 3.重复定时命令.任务 4.

从简入难makefile文件编写,Linux C++编程,简单vi命令

 1.一个最基本的C++程序 2.第二个c++程序 3.第一个入门级别的简单的makefile 4.在makefile中定义变量. 5.编写makefile的依赖 如果start:标识后面的某个.o没有,则重新编译没有编译的那个文件 6.最终的makefile文件 总结:makefile是通过.o文件是否存在已经.cpp最后的修改时间来判断是否重新编译.o文件. 7.makefile不管理.h文件,它是编译器来进行管理的. vi: i在光标之前插入 a在光标后面插入 x删除后面的字符 dd删

loadrunner 编写socket脚本实例(附服务端实现)

一.socket背景知识 这个咱就不废话了,网上一搜一大堆 二.本实例实现的功能 服务端接收客户端发送的字符串,并返回"5678succ"共8个字符 三.服务端实现(java代码) ①MySocketServer.java package serverSocketMultiThreadVer; import java.io.IOException;import java.net.InetAddress;import java.net.ServerSocket;import java.n

Socket——服务端与客户端交互的简单实现

服务端: package socket; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socke

最简单的一个socket服务端

描述:这是一个socket服务端,可以用串口调试工具连接和发送数据过来 package com.thinkgem.wlw.modules.lhjh.socket.tstandard; import java.io.BufferedInputStream; import java.io.DataInputStream; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; import j

.net如何处理高并发socket,建立高性能健壮的socket服务

1.使用supersocket 高性能的事件驱动通信; 非常简单易用; 你只需要通过创建几个类就能获得一个健壮的 Socket 服务器; 内置的命令行协议让你能够迅速创建一个网络命令行接口服务器; 强大且高性能的协议解析实现工具帮你简化了网络数据的分析工作; 灵活的配置功能和友好的配置 API; 多监听器支持; 让你在一个服务器实例内监听多个端口; 多服务器实例托管的支持让你从容面对复杂的部署需求; 应用程序域和进程级别的隔离能够满足你大部分的宿主场景; 内置的 SSL/TLS 加密支持; 会话