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. linux下apt安装mysql导致mysql.user table is damaged

    笔者在ubuntu下用 apt install mysql-server类似的命令安装mysql, 安装了最新版的mysql5.7,覆盖了操作系统内置的数据库mysql系统库. 最初启动mysql出错 ...

  2. android 设置LOGO和app名称

    mipmap和drawable目录都可以存放图片,一般情况下,将LOGO文件存放在mipmap目录,普通图片放到drawable目录. 一.在mipmap目录添加LOGO图片 在mipmap目录右键- ...

  3. java 多线程 同步 观察者 并发集合的一个例子

    //第一版 package com.hra.riskprice; import com.hra.riskprice.SysEnum.Factor_Type; import org.springfram ...

  4. 【NIFI】 Apache NiFI 之 ExecuteScript处理(二)

    本例介绍NiFI ExecuteScript处理器的使用,使用的脚本引擎ECMScript 接上一篇[NIFI] Apache NiFI 之 ExecuteScript处理(一) ExecuteScr ...

  5. 微信浏览器Ajax请求返回值走error

    微信浏览器Ajax post请求是返回值走的error $.ajax({ type: "POST", url: "https://XXXX", cache: f ...

  6. Ubuntu 18.04 Server上安装LAMP

    由于要进行渗透测试,所以这两天就在搭LAMP的环境(过程及其痛苦) 这里分享一些我遇到的问题. 首先介绍一下我的使用环境  VM虚拟机,ubuntu 与主机NAT连接 由于之前一直使用的是kali(默 ...

  7. Python开发——4.集合和字符串拼接

    一.集合(set) 1.集合的特性: 不同元素组成.元素是无序排列的可hash值 2.集合转为列表 s1 = {11,"hechouzi",(11,22,33)} names = ...

  8. Spring-Cloud之Eureka排坑之旅

    1 快速demo 1.0 环境说明   Intelli IDEA+Spring Boot 1.1 新建工程chap52(通过New Project->Spring Initializer-> ...

  9. docker相关操作

    docker 安装参照官网一步一步来,特别简单,主要是下载比较慢: docker 需要 管理员权限: docker 相关命令: 容器生命周期管理 — docker [run|start|stop|re ...

  10. javascript-浏览器消息提醒

    如何让用户在浏览器最小化的状态下也能及时的收到消息提醒呢? 这个问题作为webRd是要正面面对的. 大约可分两种场景:一种是类似桌面通知的形式还有一种是类似QQ提醒(在系统任务栏闪烁随后高亮);接下来 ...