http的共享怎么开

Python016

http的共享怎么开,第1张

这里我介绍两种方法!

一  :用IIS或者Apache之类的web服务器软件实现http文件共享

     这里我以IIS为例介绍下用常用的web服务器实现文件共享的方法,具体如下(以我机器为例):

      1、打开IIS,打开“网站 -->默认网站”,右键点击“属性”,点击“主目录”,勾选“目录浏览”选项,如下图所示:

      

    2、进入文件夹C:\Inetpub\wwwroot,拷贝文件“1.7z“到这个目录:

       

    3、打开浏览器,输入本机ip(比如我的:192.168.1.123),即可看到共享的文件并可以下载:

       

       点击“1.7z”即可下载。

二  :用python或者go语言实现http文件共享

1、python实现http文件共享:

      用过python的都知道python有一个很牛x的命令:

   python -m SimpleHTTPServer

    在C:\Python27下运行命令:

    

     打开浏览器,可以看到如下效果:

   

     这个命令的默认端口是8000,如果我再加一个端口参数,可以用其它端口进行访问,命令如下:

   

    打开浏览器:

   

        知道了这个原理,可以写个bat文件,在需要的时候copy到相应的目录双击即可,比如我的httpShare.bat文件如下:

           python -m SimpleHTTPServer 80

           默认用80端口,访问时候只需要输入我的ip地址即可。

2、go语言实现http文件共享:

上面的方法很方便,windows和linux通吃,不过前提是要安装python

这里我有个用go语言实现的,也是windows和linux通吃(windows下不知道怎么配置的可以参考我之前的文章:http://www.2cto.com/kf/201203/122327.html,类似C/C++,是代码可移植,使用前你只需编译一次。

下面是示例代码(httpShare.go):

package main

import (

    "http"

    "fmt"

)

func main(){

    h := http.FileServer(http.Dir("."))

    var port string

    fmt.Printf("Please input port Number: ")

    fmt.Scanf("%s",&port)

    http.ListenAndServe(":"+port, h)   

}

运行效果:

继续进入下一个初始化

n.netService, err = nebnet.NewNebService(n)

if err != nil {

logging.CLog().WithFields(logrus.Fields{

"err": err,

}).Fatal("Failed to setup net service.")

}

netservice有两个成员

type NebServicestruct {

node      *Node

dispatcher *Dispatcher

}

跳出stup()函数

先进入start()函数看一看

if err := n.netService.Start()err != nil {

logging.CLog().WithFields(logrus.Fields{

"err": err,

}).Fatal("Failed to start net service.")

}

进入netservice.start()

func (ns *NebService) Start() error {

logging.CLog().Info("Starting NebService...")

// start dispatcher.

  ns.dispatcher.Start()

// start node.

  if err := ns.node.Start()err != nil {

ns.dispatcher.Stop()

logging.CLog().WithFields(logrus.Fields{

"err": err,

}).Error("Failed to start NebService.")

return err

}

logging.CLog().Info("Started NebService.")

return nil

}

可以看到第一个start()的函数是dispatcher.start()

进入dispatch.start()

func (dp *Dispatcher) Start() {

logging.CLog().Info("Starting NebService Dispatcher...")

go dp.loop()

}

然后就出现一个新的线程、goruntime

go dp.loop()

进入该线程,看它干了些什么

timerChan := time.NewTicker(time.Second).C

for {

select {

case <-timerChan:

metricsDispatcherCached.Update(int64(len(dp.receivedMessageCh)))

case <-dp.quitCh:

logging.CLog().Info("Stoped NebService Dispatcher.")

return

  case msg := <-dp.receivedMessageCh:

msgType := msg.MessageType()

v, _ := dp.subscribersMap.Load(msgType)

if v == nil {

continue

      }

m, _ := v.(*sync.Map)

m.Range(func(key, valueinterface{}) bool {

select {

case key.(*Subscriber).msgChan <- msg:

default:

logging.VLog().WithFields(logrus.Fields{

"msgType": msgType,

}).Warn("timeout to dispatch message.")

}

return true

      })

}

}

一个有点长的循环

metricsDispatcherCached.Update(int64(len(dp.receivedMessageCh)))一秒钟刷新一次缓冲区

case msg := <-dp.receivedMessageCh:

msgType := msg.MessageType()如果能取出dp.receivedMessageCh

msgType := msg.MessageType()首先判断取出的信息类型

v, _ := dp.subscribersMap.Load(msgType)

if v == nil {

continue

}

根据类型取出相应的map

如果取不出,那么使用continue结束这个case

m, _ := v.(*sync.Map)

断言

m.Range(func(key, valueinterface{}) bool {

select {

case key.(*Subscriber).msgChan <- msg:

default:

logging.VLog().WithFields(logrus.Fields{

"msgType": msgType,

}).Warn("timeout to dispa+tch message.")

}

return true

})

将msg推入其他管道里面去。其他goruntime会循环等待该

无缓冲的通道(unbuffered channel)是指在接收前没有能力保存任何值的通道。

这种类型的通道要求发送goroutine和接收goroutine同时准备好,才能完成发送和接收操作。否则,通道会导致先执行发送或接收操作的 goroutine 阻塞等待。

这种对通道进行发送和接收的交互行为本身就是同步的。其中任意一个操作都无法离开另一个操作单独存在。

阻塞:由于某种原因数据没有到达,当前协程(线程)持续处于等待状态,直到条件满足,才接触阻塞。

同步:在两个或多个协程(线程)间,保持数据内容一致性的机制。

下图展示两个 goroutine 如何利用无缓冲的通道来共享一个值:

在第 1 步,两个 goroutine 都到达通道,但哪个都没有开始执行发送或者接收。

在第 2 步,左侧的 goroutine 将它的手伸进了通道,这模拟了向通道发送数据的行为。这时,这个 goroutine 会在通道中被锁住,直到交换完成。

在第 3 步,右侧的 goroutine 将它的手放入通道,这模拟了从通道里接收数据。这个 goroutine 一样也会在通道中被锁住,直到交换完成。

在第 4 步和第 5 步,进行交换,并最终,在第 6 步,两个 goroutine 都将它们的手从通道里拿出来,这模拟了被锁住的 goroutine 得到释放。两个 goroutine 现在都可以去做别的事情了。

如果没有指定缓冲区容量,那么该通道就是同步的,因此会阻塞到发送者准备好发送和接收者准备好接收。

无缓冲channel: —— 同步通信