在上篇博客中写到如何用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. Linux程序宕掉后如何通过gdb查看出错信息

    我们在编写服务端程序的时候,由于多线程并且环境复杂,程序可能在不确定条件的情况下宕掉,还不好重新,这是我们如何获取程序的出错信息,一种方法通过打日志,有时候一些错误日志也不能体现出来,这时就用到我们的 ...

  2. 【并发编程】MESI--CPU缓存一致性协议

    原文:多线程之:MESI-CPU缓存一致性协议 概念 MESI(Modified Exclusive Shared Or Invalid)(也称为伊利诺斯协议,是因为该协议由伊利诺斯州立大学提出)是一 ...

  3. 联想的笔记本有隐藏分区 导致无法安装win10 eufi启动 报错:windows无法更新计算机的启动配置。无法安装

    联想的笔记本都带着类似一键还原等的系统恢复软件,这些软件往往是将出厂设置备份在单 独的一个分区,此分区默认为隐藏,在 Windows 的磁盘管理中可以看到.打开磁盘管理器 的方法是右击计算机——管理, ...

  4. [报错]java.lang.ClassCastException

    Caused by: java.lang.ClassCastException: org.apache.xml.dtm.ref.DTMManagerDefault cannot be cast to ...

  5. C++回顾day03---<类型转换>

    一:C++类型转换 (一)static_cast<>() 静态类型转换:基本类型可以转换但是指针类型不允许.可以进行隐式类型转换 double n=1.23 int m=static_ca ...

  6. [物理学与PDEs]第3章第2节 磁流体力学方程组 2.3 磁流体力学方程组

    1.  磁流体力学方程组 $$\beex \bea \cfrac{\p {\bf H}}{\p t} &-\rot({\bf u}\times{\bf H})=\cfrac{1}{\sigma ...

  7. Javaweb学习笔记——(二十七)——————泛型、泛型的通配符、反射泛型信息、反射注解、注解

    泛型     1.泛型类:具有一个或多个类型变量的类,称之为泛型类 class A<T>{ } 2.在创建泛型实例时,需要为其类型变量赋值 A<String> a = new ...

  8. Nginx web 服务器 安装篇

    Nginx介绍: 静态web服务器有Nginx .Apache .lighttpd等 目前国内用的最常见的就是Nginx 和Apache 是一个开源的.支持高性能.高并发的www服务和代理服务软件,N ...

  9. webpack学习笔记——publicPath路径问题

    output: { filename: "[name].js", path:path.resolve(__dirname,"build") } 如果没有指定pu ...

  10. UOJ #109「APIO2013」TASKSAUTHOR

    貌似是最入门的题答题 刚好我就是入门选手 就这样吧 UOJ #109 题意 太热了不讲了 $ Solution$ 第一个点:$ 105$个数字卡掉$ Floyd$ 直接$101$个点无出边一次询问就好 ...