在上篇博客中写到如何用Python实现一个类似tomcat的简单服务器,接下来用go语言去实现

1. Go本身自己封装实现了非常简单的httpServer

package main

import (
"bufio"
"fmt"
"io"
"net/http"
"os"
"strings"
) func main() {
//http请求处理
http.HandleFunc("/", handler1)
//绑定监听地址和端口
http.ListenAndServe("localhost:8080", nil)
} //请求处理函数
func handler1(w http.ResponseWriter, r *http.Request) {
//获取请求资源
path := r.URL.Path
if strings.Contains(path[1:], "") {
//返回请求资源
fmt.Fprintf(w, getHtmlFile("index.html"))
} else {
if strings.Contains(path[1:], ".html") {
w.Header().Set("content-type", "text/html")
fmt.Fprintf(w, getHtmlFile(path[1:]))
}
if strings.Contains(path[1:], ".css") {
w.Header().Set("content-type", "text/css")
fmt.Fprintf(w, getHtmlFile(path[1:]))
}
if strings.Contains(path[1:], ".js") {
w.Header().Set("content-type", "text/javascript")
fmt.Fprintf(w, getHtmlFile(path[1:]))
}
if strings.Contains(path[1:], "") {
fmt.Print(strings.Contains(path[1:], ""))
}
} } func getHtmlFile(path string) (fileHtml string) {
file, err := os.Open(path)
if err != nil {
panic(err)
}
defer file.Close() rd := bufio.NewReader(file)
for {
line, err := rd.ReadString('\n') if err != nil || io.EOF == err {
break
}
fileHtml += line
}
return fileHtml
}

从上面的代码可以看出,关键的依赖是net/http,这个类库实现得非常好,而且支持并发,在这个就不去分析源码。

2. 但对于自己实现简易的服务器,最好还是用socket去实现:

实现之前还是需具备了解http等一些基础知识,因为上篇博客已经介绍了,所以在这里不介绍了 直接写代码

package main

import (
"bufio"
"fmt"
"io"
"log"
"net"
"os"
"strings"
) func main() {
//确定协议及绑定IP及端口
netListen, err := net.Listen("tcp", "localhost:8080")
CheckError(err)
defer netListen.Close()
Log("waiting for client request")
for {
//接受请求连接
conn, err := netListen.Accept()
if err != nil {
CheckError(err)
break
} else {
Log(conn.RemoteAddr().String(), "tcp connect success")
//处理请求连接
handleConnection(conn)
}
conn.Close()
}
} //处理请求连接函数
func handleConnection(conn net.Conn) {
buffer := make([]byte, 2048)
n, err := conn.Read(buffer)
if err != nil {
Log(conn.RemoteAddr().String(), " connection error: ", err)
conn.Close()
} else {
Log(conn.RemoteAddr().String(), "receive data string:\n", string(buffer[:n]))
//返回数据给客户端
responseInfoToClient(conn, string(buffer[:n]), err)
}
} //返回数据的函数
func responseInfoToClient(conn net.Conn, requestInfo string, err error) {
//获取http协议头
conn.Write([]byte(getFileContent("head.md")))
conn.Write([]byte("\n"))
var path string = strings.Replace(getMidStr(requestInfo, "GET /", "HTTP"), " ", "", -1)
fmt.Println(path)
if path != "" {
if path == "favicon.ico" {
fmt.Println("every connect hava favicon.ico resource request")
} else {
_, err = os.Open(path)
if err != nil {
fmt.Println("RESTful")
} else {
conn.Write([]byte(getFileContent(path)))
}
}
} else {
conn.Write([]byte(getFileContent("index.html")))
}
} func getMidStr(data string, startStr string, endStr string) (reqSouce string) {
var startIndex int = strings.Index(data, startStr)
var info string
if startIndex >= 0 {
startIndex += len(startStr)
var endIndex int = strings.Index(data, endStr)
info = data[startIndex:endIndex]
}
return info
} func getFileContent(path string) (fileInfo string) {
file, err := os.Open(path)
if err != nil {
panic(err)
}
defer file.Close() rd := bufio.NewReader(file)
for {
line, err := rd.ReadString('\n') if err != nil || io.EOF == err {
break
}
fileInfo += line
}
return fileInfo
} func Log(v ...interface{}) {
log.Println(v...)
} func CheckError(err error) {
if err != nil {
fmt.Fprintf(os.Stderr, "Fatal error: %s", err.Error())
os.Exit(1)
}
}

源码下载:https://github.com/Jiashengp/GoHttpServer

Go Socket实现简单的HttpServer的更多相关文章

  1. 利用Java手写简单的httpserver

    前言: 在看完尚学堂JAVA300中讲解如何实现一个最简单的httpserver部分的视频之后, 一.前置知识 1.HTTP协议 当前互联网网页访问主要采用了B/S的模式,既一个浏览器,一个服务器,浏 ...

  2. socket.io简单入门(一.实现简单的图表推送)

    引子:随着nodejs蓬勃发展,虽然主要业务系统因为架构健壮性不会选择nodejs座位应用服务器.但是大量的内部系统却可以使用nodejs试水,大量的前端开发人员转入全堆开发也是一个因素. 研究本例主 ...

  3. socket.io简单说明及在线抽奖demo

    socket.io简单说明及在线抽奖demo socket.io 简介 Socket.IO可以实现实时双向的基于事件的通信. 它适用于各种平台,浏览器或设备,也同样注重可靠性和速度. socket.i ...

  4. 运用socket实现简单的服务器客户端交互

    Socket解释: 网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket. Socket的英文原义是“孔”或“插座”.作为BSD UNIX的进程通信机制,取后一种意 ...

  5. java Socket实现简单在线聊天(二)

    接<java Socket实现简单在线聊天(一)>,在单客户端连接的基础上,这里第二步需要实现多客户端的连接,也就需要使用到线程.每当有一个新的客户端连接上来,服务端便需要新启动一个线程进 ...

  6. java Socket实现简单在线聊天(一)

    最近的项目有一个在线网页交流的需求,由于很久以前做过的demo已经忘记的差不多了,因此便重新学习一下. 我计划的大致实现步骤分这样几大步: 1.使用awt组件和socket实现简单的单客户端向服务端持 ...

  7. Java的Socket通信简单实例

    服务端 package testlxd; import java.io.BufferedReader; import java.io.IOException; import java.io.Input ...

  8. 基于epoll的简单的httpserver

    该httpserver已经能够处理并发连接,支持多个client并发訪问,每一个连接能够持续读写数据.当然.这仅仅是一个简单的学习样例.还有非常多bug,发表出来仅仅是希望大家能够互相学习.我也在不断 ...

  9. 二、socket编写简单BIO的HTTP服务器

    一.目标 诸如tomcat等web服务器中间件简化了我们web的开发成本,但有时候我们或许并不需要这么一个完备的服务器,只是希望做一个简单地处理或者做特殊用途的服务器. 本文将提供一个HTTP的服务器 ...

随机推荐

  1. Nginx安全相关配置和nginx.conf中文详解

    一.centos下redis安全相关 1.背景 在使用云服务器时,如果我们的redis关闭了protected-mode模式,被病毒攻击的可能会大大增加,因此我们使用redis时候,最好更改默认端口, ...

  2. 金融量化之Tushare模块

    一.介绍 Tushare是一个免费.开源的python财经数据接口包.主要实现对股票等金融数据从数据采集.清洗加工 到 数据存储的过程,能够为金融分析人员提供快速.整洁.和多样的便于分析的数据,为他们 ...

  3. Linux查看文件以及磁盘空间大小管理(转)

    (1)查看文件大小  查看当前文件夹下所有文件大小(包括子文件夹)    du -sh   # du -h15M     ./package16K     ./.fontconfig4.0K    . ...

  4. FileZilla-01

    FileZilla FTP-client可用于通过上传和下载文件和图像来管理WordPress网站. 设置选项: 01.网址:ftp地址(如果网址是http://example.com,则通常是ftp ...

  5. bzoj 3223: Tyvj 1729 文艺平衡树 (splay)

    链接: https://www.lydsy.com/JudgeOnline/problem.php?id=3223 题面: 3223: Tyvj 1729 文艺平衡树 Time Limit: 10 S ...

  6. BZOJ 3653: 谈笑风生(离线, 长链剖分, 后缀和)

    题意 给你一颗有 \(n\) 个点并且以 \(1\) 为根的树.共有 \(q\) 次询问,每次询问两个参数 \(p, k\) .询问有多少对点 \((p, a, b)\) 满足 \(p,a,b\) 为 ...

  7. pytest 10 skip跳过测试用例

    pytest.mark.skip可以标记无法在某些平台上运行的测试功能,或者你希望失败的测试功能 skip意味着只有在满足某些条件时才希望测试通过,否则pytest应该跳过运行测试.常见事例时非win ...

  8. 【强大精美的PS特效滤镜合集】Alien Skin Eye Candy for Mac 7.2.2.20

    [简介] Alien Skin Eye Candy for Mac 7.2.2 版本,支持最新的PhotoShop CC 2019.2018等版本,这是一款强大酷炫的PS特效滤镜合集,具有32种滤镜和 ...

  9. Numpy系列(十二)- 矩阵运算

    numpy模块中的矩阵对象为numpy.matrix,包括矩阵数据的处理,矩阵的计算,以及基本的统计功能,转置,可逆性等等,包括对复数的处理,均在matrix对象中. class numpy.matr ...

  10. 分布式监控系统开发【day37】:监控客户端开发(五)

    一.目录结构 二.模块方法调用关系总图 三.入口文件main 1.解决了说明问题 1.客户端就干了一件事情,干什么事情 收集数据汇报给服务端? 但是我这个客户端是插件形式2.首先必须要传一个参数,st ...