http1

package main

import (
"log"
"net/http"
"fmt"
) func main() {
db:=database{"shoes":,"socks":}
log.Fatal(http.ListenAndServe("localhost:5000",db))
}
type dollars float32 func (d dollars) String() string {
return fmt.Sprintf("$%.2f",d)
}
type database map[string]dollars func (db database) ServeHTTP(w http.ResponseWriter, req *http.Request) {
for item,price:=range db{
fmt.Fprintf(w,"%s: %s\n",item,price)
}
}

打开浏览器:http://localhost:5000/

http2

package main

import (
"fmt"
"net/http"
"log"
) func main() {
db:=database{"shoes":,"socks":}
mux:=http.NewServeMux()
mux.Handle("/list",http.HandlerFunc(db.list))
mux.Handle("/price",http.HandlerFunc(db.price))
log.Fatal(http.ListenAndServe("localhost:5000",mux))
}
type database map[string]dollars
type dollars float32 func (d dollars) String() string {
return fmt.Sprintf("$%.2f",d)
}
func (db database) list(w http.ResponseWriter, req *http.Request) {
for item,price:=range db{
fmt.Fprintf(w,"%s: %s\n",item,price)
}
}
func (db database) price(w http.ResponseWriter,req *http.Request) {
item:=req.URL.Query().Get("item")
price,ok:=db[item]
if !ok{
w.WriteHeader(http.StatusNotFound)
fmt.Fprintf(w,"no such item: %q\n",item)
return
}
fmt.Fprintf(w,"%s\n",price)
}

打开浏览器:http://localhost:5000/price?item=socks

clock1

package main

import (
"net"
"io"
"time"
"log"
) func main() {
listener,err:=net.Listen("tcp","localhost:8000")
if err!=nil{
log.Fatal(err)
}
for{
conn,err:=listener.Accept()
if err!=nil{
log.Print(err)
continue
}
handleConn(conn)
}
} func handleConn(c net.Conn) {
defer c.Close()
for{
_,err:=io.WriteString(c,time.Now().Format("15:04:05\r\n"))
if err!=nil{
return
}
time.Sleep(*time.Second)
}
}

运行clock1,打开cmd,使用telnet localhost 8000 进行连接

或者使用下面的程序

netcat1

package main

import (
"io"
"log"
"net"
"os"
) func main() {
conn,err:=net.Dial("tcp","localhost:8000")
if err!=nil{
log.Fatal(err)
}
defer conn.Close()
mustCopy(os.Stdout,conn)
} func mustCopy(dst io.Writer, src io.Reader) {
if _,err:=io.Copy(dst,src);err!=nil{
log.Fatal(err)
}
}

为了让服务器支持并发,只需要在handleConn上添加一个go

clock2

    for{
conn,err:=listener.Accept()
if err!=nil{
log.Print(err)
continue
}
go handleConn2(conn)
}

go http.Handler的更多相关文章

  1. android Handler介绍

    Handler使用介绍: Handler根据接收的消息,处理UI更新.Thread线程发出消息,通知Handler更新UI. Handler mHandler = new Handler() {  p ...

  2. Handler

    1.1 继承AbstractController优点:能定制请求方式 package cn.happyl.controller; import javax.servlet.http.HttpServl ...

  3. Android消息处理机制(Handler、Looper、MessageQueue与Message)

    Android是消息驱动的,实现消息驱动有几个要素: 消息的表示:Message 消息队列:MessageQueue 消息循环,用于循环取出消息进行处理:Looper 消息处理,消息循环从消息队列中取 ...

  4. Android笔记——Handler Runnable与Thread的区别

    在java中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口:Thread类是在java.lang包中定义的.一个类只要继承了Thread类同时覆写了本类中的run() ...

  5. Android消息传递之Handler消息机制

    前言: 无论是现在所做的项目还是以前的项目中,都会遇见线程之间通信.组件之间通信,目前统一采用EventBus来做处理,在总结学习EventBus之前,觉得还是需要学习总结一下最初的实现方式,也算是不 ...

  6. Handler系列之内存泄漏

    本篇简单的讲一下平常使用Handler时造成内存泄漏的问题. 什么是内存泄漏?大白话讲就是分配出去的内存,回收不回来.严重会导致内存不足OOM.下面来看一下造成内存泄漏的代码: public clas ...

  7. Handler系列之创建子线程Handler

    上一篇我介绍了Handler机制的工作原理,默认情况下,ActivityThread类为我们创建的了主线程的Looper和消息队列,所以当你创建Handler之后发送消息的时候,消息的轮训和handl ...

  8. Handler系列之原理分析

    上一节我们讲解了Handler的基本使用方法,也是平时大家用到的最多的使用方式.那么本节让我们来学习一下Handler的工作原理吧!!! 我们知道Android中我们只能在ui线程(主线程)更新ui信 ...

  9. Handler系列之使用

    作为一个Android开发者,我们肯定熟悉并使用过Handler机制.最常用的使用场景是"在子线程更新ui",实际上我们知道上面的说话是错误的.因为Android中只有主线程才能更 ...

  10. 阶段一:用Handler和Message实现计时效果及其中一些疑问

    “阶段一”是指我第一次系统地学习Android开发.这主要是对我的学习过程作个记录. 本来是打算继续做天气预报的优化的,但因为某些原因,我要先把之前做的小应用优化一下.所以今天就插播一下用Handle ...

随机推荐

  1. NoSql 数据库理解

    主要分类: 键值(Key-Value)存储数据库 这一类数据库主要会使用到一个哈希表,这个表中有一个特定的键和一个指针指向特定的数据.Key/value模型对于IT系统来说的优势在于简单.易部署.但是 ...

  2. 回溯算法_ BackTracking

     目前还存在的疑问: 1. 所谓的该分支满足条件之后就回退到上一层节点,可是加谁呢? x[i+1]  ?? 加到 N, 不满足target sum条件就返回上一级(同时改变上一级数为 i+1...纵向 ...

  3. How to configure Samba Server share on Debian 9 Stretch Linux

    Lubos Rendek Debian 13 June 2017 Contents 1. Objective 2. Operating System and Software Versions 3.  ...

  4. [杂谈]杂谈章1 问几个JAVA问题

    1.面向对象.面向过程 区别 2.Java 如何实现的平台无关 和C/C++不同的是,Java语言提供的编译器不针对特定的操作系统和CPU芯片进行编程,而是针对Java虚拟机把Java源程序编译成称为 ...

  5. windows下使用redis c++

    redis是高效key-value NOSQL 数据库 代码开源 windows下使用需要使用微软在redis官方上的改进版 地址 https://redis.io/download 寻找window ...

  6. Python3实战系列之六(获取印度售后数据项目)

    问题:续接上一篇.说干咱就干呀,勤勤恳恳写程序呀! 目标:此篇我们试着把python程序打包成.exe程序.这样就可以在服务器上运行了.实现首篇计划列表功能模块的第三步: 3..exe文件能在服务器上 ...

  7. mysql c-api 预处理语句

    stmt = mysql_stmt_init(mysql) mysql_stmt_prepare(stmt, "SELECT ?", strlen("SELECT ?&q ...

  8. jquery中siblings方法配合什么方法一起使用

    siblings() 获得匹配集合中每个元素的同胞,通过选择器进行筛选是可选的.接下来通过本文给大家介绍jQuery siblings()用法实例详解,需要的朋友参考下吧 siblings() 获得匹 ...

  9. ABP框架系列之十九:(Debugging-调试)

    While it's not generally needed, you may want to step into ABP's source code while you debugging you ...

  10. 可遇不可求的Question之skip-name-resolve模式篇

    mysql启用skip-name-resolve模式时出现Warning的处理办法 在优化MYSQL配置时,加入 skip-name-resolve ,在重新启动MYSQL时检查启动日志,发现有警告信 ...