go http.Handler
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的更多相关文章
- android Handler介绍
Handler使用介绍: Handler根据接收的消息,处理UI更新.Thread线程发出消息,通知Handler更新UI. Handler mHandler = new Handler() { p ...
- Handler
1.1 继承AbstractController优点:能定制请求方式 package cn.happyl.controller; import javax.servlet.http.HttpServl ...
- Android消息处理机制(Handler、Looper、MessageQueue与Message)
Android是消息驱动的,实现消息驱动有几个要素: 消息的表示:Message 消息队列:MessageQueue 消息循环,用于循环取出消息进行处理:Looper 消息处理,消息循环从消息队列中取 ...
- Android笔记——Handler Runnable与Thread的区别
在java中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口:Thread类是在java.lang包中定义的.一个类只要继承了Thread类同时覆写了本类中的run() ...
- Android消息传递之Handler消息机制
前言: 无论是现在所做的项目还是以前的项目中,都会遇见线程之间通信.组件之间通信,目前统一采用EventBus来做处理,在总结学习EventBus之前,觉得还是需要学习总结一下最初的实现方式,也算是不 ...
- Handler系列之内存泄漏
本篇简单的讲一下平常使用Handler时造成内存泄漏的问题. 什么是内存泄漏?大白话讲就是分配出去的内存,回收不回来.严重会导致内存不足OOM.下面来看一下造成内存泄漏的代码: public clas ...
- Handler系列之创建子线程Handler
上一篇我介绍了Handler机制的工作原理,默认情况下,ActivityThread类为我们创建的了主线程的Looper和消息队列,所以当你创建Handler之后发送消息的时候,消息的轮训和handl ...
- Handler系列之原理分析
上一节我们讲解了Handler的基本使用方法,也是平时大家用到的最多的使用方式.那么本节让我们来学习一下Handler的工作原理吧!!! 我们知道Android中我们只能在ui线程(主线程)更新ui信 ...
- Handler系列之使用
作为一个Android开发者,我们肯定熟悉并使用过Handler机制.最常用的使用场景是"在子线程更新ui",实际上我们知道上面的说话是错误的.因为Android中只有主线程才能更 ...
- 阶段一:用Handler和Message实现计时效果及其中一些疑问
“阶段一”是指我第一次系统地学习Android开发.这主要是对我的学习过程作个记录. 本来是打算继续做天气预报的优化的,但因为某些原因,我要先把之前做的小应用优化一下.所以今天就插播一下用Handle ...
随机推荐
- python --数据可视化(一)
python --数据可视化 一.python -- pyecharts库的使用 pyecharts--> 生成Echarts图标的类库 1.安装: pip install pyecharts ...
- iview表格高度自适应只需要三步即可
1. 需要增加到table表格里的 highlight-row :height="tableHeight" ref="table" 2.在return 定义一个 ...
- Solidity的地址 数组如何判断是否包含一个给定的地址?
Q: given address[] wallets. What is the correct method to check that the list contains a given addre ...
- android studio Error:Execution failed for task ':app:processDebugResources'. > com.android.ide.common.process.ProcessException: Failed to execute aapt
情况很奇怪 我是更新版本; 问题解决: clean project; 可能是编辑器有地方存有配置数据;
- 选择困难症的福音——团队Scrum冲刺阶段-Day 3
选择困难症的福音--团队Scrum冲刺阶段-Day 3 今日进展 编写提问部分 做了不同问题所对应的游戏选项,但关于游戏分类的界面还没有做完 登陆注册界面 更改ui界面,ui界面终于变好看了:) 学习 ...
- Java 正则表达式之捕获组
Java 正则表达式之捕获组 1. Java 正则表达式基础 2. Java 正则表达式之捕获组 一.概述 1.1 什么是捕获组 捕获组就是把正则表达式中子表达式匹配的内容,保存到内存中以数字编号或显 ...
- c++沉思录 学习笔记 第六章 句柄(引用计数指针雏形?)
一个简单的point坐标类 class Point {public: Point():xval(0),yval(0){} Point(int x,int y):xval(x),yval(y){} in ...
- win10自带输入法的标点符号切换
快捷键是ctrl+句号 然后开启设置,把中文也用英文标点也选上.
- android开发环境配置以及测试所遇到的的问题
今天我没有继续进行,整理了一线之前犯下的错误.在一开始的android的环境配置的时候,按照网上的教程,我还是走了许多弯道,其中遇到了不少的问题,但是现在都一一解决了. 配置时安装东西少 在配置的时候 ...
- 利用ONENET平台控制MPC
可以用于广告机或者灾害预警,实时广播等行业 这个分控制端和服务端 控制端采用winform编写,服务端采用控制台程序编写 优点在于服务端不用有公网ip,比传统方案方便的多. 也不用租用费用高额的云服务 ...