當前位置:首頁 » 操作系統 » p2p源碼下載

p2p源碼下載

發布時間: 2023-01-04 15:33:19

Ⅰ IPFS(四) 源碼解讀之-p2p

package p2p

import (
"context"
"errors"
"time"

net "gx/ipfs//go-libp2p-net"
manet "gx/ipfs//go-multiaddr-net"
ma "gx/ipfs//go-multiaddr"
pro "gx/ipfs//go-libp2p-protocol"
pstore "gx/ipfs//go-libp2p-peerstore"
p2phost "gx/ipfs//go-libp2p-host"
peer "gx/ipfs//go-libp2p-peer"
)
//P2P結構保存當前正在運行的流/監聽器的信息
// P2P structure holds information on currently running streams/listeners
type P2P struct {
//監聽器
Listeners ListenerRegistry
//數據流
Streams StreamRegistry
//節點ID
identity peer.ID
//節點地址
peerHost p2phost.Host
//一個線程安全的對等節點存儲
peerstore pstore.Peerstore
}
//創建一個新的p2p結構
// NewP2P creates new P2P struct
//這個新的p2p結構不包含p2p結構中的監聽器和數據流
func NewP2P(identity peer.ID, peerHost p2phost.Host, peerstore pstore.Peerstore) *P2P {
return &P2P{
identity: identity,
peerHost: peerHost,
peerstore: peerstore,
}
}
//新建一個數據流 工具方法 構建一個有節點id,內容和協議的流
func (p2p P2P) newStreamTo(ctx2 context.Context, p peer.ID, protocol string) (net.Stream, error) {
//30s 後會自動timeout
ctx, cancel := context.WithTimeout(ctx2, time.Second
30) //TODO: configurable?
defer cancel()
err := p2p.peerHost.Connect(ctx, pstore.PeerInfo{ID: p})
if err != nil {
return nil, err
}

return p2p.peerHost.NewStream(ctx2, p, pro.ID(protocol))
}
//對話為遠程監聽器創建新的P2P流
//創建一個新的p2p流實現對對話的監聽
// Dial creates new P2P stream to a remote listener
//Multiaddr是一種跨協議、跨平台的表示格式的互聯網地址。它強調明確性和自我描述。
//對內接收
func (p2p P2P) Dial(ctx context.Context, addr ma.Multiaddr, peer peer.ID, proto string, bindAddr ma.Multiaddr) ( ListenerInfo, error) {
//獲取一些節點信息 network, host, nil
lnet, _, err := manet.DialArgs(bindAddr)
if err != nil {
return nil, err
}
//監聽信息
listenerInfo := ListenerInfo{
//節點身份
Identity: p2p.identity,
////應用程序協議標識符。
Protocol: proto,
}
//調用newStreamTo 通過ctx(內容) peer(節點id) proto(協議標識符) 參數獲取一個新的數據流
remote, err := p2p.newStreamTo(ctx, peer, proto)
if err != nil {
return nil, err
}
//network協議標識
switch lnet {
//network為"tcp", "tcp4", "tcp6"
case "tcp", "tcp4", "tcp6":
//從監聽器獲取新的信息 nla.Listener, nil
listener, err := manet.Listen(bindAddr)
if err != nil {
if err2 := remote.Reset(); err2 != nil {
return nil, err2
}
return nil, err
}
//將獲取的新信息保存到listenerInfo
listenerInfo.Address = listener.Multiaddr()
listenerInfo.Closer = listener
listenerInfo.Running = true
//開啟接受
go p2p.doAccept(&listenerInfo, remote, listener)

default:
return nil, errors.New("unsupported protocol: " + lnet)
}

return &listenerInfo, nil
}
//
func (p2p *P2P) doAccept(listenerInfo *ListenerInfo, remote net.Stream, listener manet.Listener) {
//關閉偵聽器並刪除流處理程序
defer listener.Close()
//Returns a Multiaddr friendly Conn
//一個有好的 Multiaddr 連接
local, err := listener.Accept()
if err != nil {
return
}

stream := StreamInfo{
//連接協議
Protocol: listenerInfo.Protocol,
//定位節點
LocalPeer: listenerInfo.Identity,
//定位節點地址
LocalAddr: listenerInfo.Address,
//遠程節點
RemotePeer: remote.Conn().RemotePeer(),
//遠程節點地址
RemoteAddr: remote.Conn().RemoteMultiaddr(),
//定位
Local: local,
//遠程
Remote: remote,
//注冊碼
Registry: &p2p.Streams,
}
//注冊連接信息
p2p.Streams.Register(&stream)
//開啟節點廣播
stream.startStreaming()
}
//偵聽器將流處理程序包裝到偵聽器中
// Listener wraps stream handler into a listener
type Listener interface {
Accept() (net.Stream, error)
Close() error
}
//P2PListener保存關於偵聽器的信息
// P2PListener holds information on a listener
type P2PListener struct {
peerHost p2phost.Host
conCh chan net.Stream
proto pro.ID
ctx context.Context
cancel func()
}
//等待偵聽器的連接
// Accept waits for a connection from the listener
func (il *P2PListener) Accept() (net.Stream, error) {
select {
case c := <-il.conCh:
return c, nil
case <-il.ctx.Done():
return nil, il.ctx.Err()
}
}
//關閉偵聽器並刪除流處理程序
// Close closes the listener and removes stream handler
func (il *P2PListener) Close() error {
il.cancel()
il.peerHost.RemoveStreamHandler(il.proto)
return nil
}
// Listen創建新的P2PListener
// Listen creates new P2PListener
func (p2p P2P) registerStreamHandler(ctx2 context.Context, protocol string) ( P2PListener, error) {
ctx, cancel := context.WithCancel(ctx2)

list := &P2PListener{
peerHost: p2p.peerHost,
proto: pro.ID(protocol),
conCh: make(chan net.Stream),
ctx: ctx,
cancel: cancel,
}

p2p.peerHost.SetStreamHandler(list.proto, func(s net.Stream) {
select {
case list.conCh <- s:
case <-ctx.Done():
s.Reset()
}
})

return list, nil
}
// NewListener創建新的p2p偵聽器
// NewListener creates new p2p listener
//對外廣播
func (p2p P2P) NewListener(ctx context.Context, proto string, addr ma.Multiaddr) ( ListenerInfo, error) {
//調用registerStreamHandler 構造一個新的listener
listener, err := p2p.registerStreamHandler(ctx, proto)
if err != nil {
return nil, err
}
//構造新的listenerInfo
listenerInfo := ListenerInfo{
Identity: p2p.identity,
Protocol: proto,
Address: addr,
Closer: listener,
Running: true,
Registry: &p2p.Listeners,
}

go p2p.acceptStreams(&listenerInfo, listener)
//注冊連接信息
p2p.Listeners.Register(&listenerInfo)

return &listenerInfo, nil
}
//接受流
func (p2p *P2P) acceptStreams(listenerInfo *ListenerInfo, listener Listener) {
for listenerInfo.Running {
//一個有好的 遠程 連接
remote, err := listener.Accept()
if err != nil {
listener.Close()
break
}

}
//取消注冊表中的p2p偵聽器
p2p.Listeners.Deregister(listenerInfo.Protocol)
}
// CheckProtoExists檢查是否注冊了協議處理程序
// mux處理程序
// CheckProtoExists checks whether a protocol handler is registered to
// mux handler
func (p2p *P2P) CheckProtoExists(proto string) bool {
protos := p2p.peerHost.Mux().Protocols()

for _, p := range protos {
if p != proto {
continue
}
return true
}
return false
}

Ⅱ 如何BT下載

BitTorrent使用:

以http://61.135.150.153/BJpatch1239.exe.torrent為例,左鍵點擊網頁上的torrent下載鏈接,可以看到開始下載一個.torrent的文件。

這個文件很小(一般20k-100k),很快就下載完了,接著就彈出對話框詢問文件/文件夾存放位置:

接著BT開始分配空間,需要1到2分鍾,視下載文件大小而定。如圖是分配空間進度:(注意:此時download rate 與upload rate 的沒有數值)

分配空間完畢,就會自行下載文件。如圖是下載進度:(注意:此時download rate 與upload rate 的有0值,這是下載與上傳的速率。初始時下載會比較慢,它會隨著你你上傳的速度增加而增加,因為BT軟體會優先於上傳速度快的人)

接著下載就正式開始了,可以看到,剛開始的速度不快,一般來說,後來的速度會逐漸加快,如果你中途中斷下載,沒關系,支持斷點續傳。

重新點擊下載鏈接,在彈出的保存位置對話框中,覆蓋上一次的文件或者目錄。

BT會掃描一遍上次未下載完成的文件。

繼續等待,直到看到完成畫面出現,說明下載完成。

請注意:請不要馬上關閉這個窗口,因為這時候你可以給別人提供下載,正像別人給你提供下載一樣。

Ⅲ 有沒有免費的P2P網貸源代碼下載

網貸畢竟是很嚴謹的系統,免費下載的網貸源碼首先你要考慮到是否安全,畢竟免費的可能很多人在使用,其實開發一套網貸系統源碼,更需要有經驗的開發人員或者團隊,就像迪蒙的P2P網貸系統,以大數據、雲計算、金融科技等技術為基礎,基於大數據分析,結合反欺詐系統及風控模型對借款人資信進行評估,所以要綜合去評估系統,不能僅僅考慮系統的價格。你自己酌情考慮下

Ⅳ p2p借貸系統哪裡可以有開源源碼

迪蒙網貸系統p2p借貸系統開發,提供JAVA源碼。而且技術人員很多,安全性、穩定性、延展性在國內居於領先水平,已茁壯成長為中國P2P網貸行業市場佔有率最高的網貸系統品牌.

Ⅳ P2P網貸系統源碼可以在哪裡下載到

正規的系統開發商比較好,網上很多提供免費下載的都不全。建議了解下帝隆P2P

Ⅵ 哪能找到用C++實現的p2p軟體源代碼

你可以的源碼天空裡面找找,那裡有不少的代碼。
地址是:www.codesky.net

Ⅶ 哪裡可以看到p2p網站建設的源碼

這種東西又很多,尤其是源碼類的東西都比較多,但是很多網站上的都很雜,你主要是做p2p,安全肯定很重要的,所以不能亂用,建議你自己整一套比較好, 比如說迪蒙的,可以參考一下。

熱點內容
功夫特牛腳本 發布:2025-05-11 00:32:37 瀏覽:338
autojs腳本代碼 發布:2025-05-11 00:32:35 瀏覽:931
spl編程 發布:2025-05-11 00:25:14 瀏覽:63
linux搭建android開發環境 發布:2025-05-11 00:18:45 瀏覽:947
web本地存儲 發布:2025-05-11 00:13:33 瀏覽:360
為什麼暗格里的密碼搜不到了 發布:2025-05-11 00:13:31 瀏覽:942
oracle存儲過程使用變數 發布:2025-05-11 00:10:07 瀏覽:741
用安卓下載蘋果的軟體叫什麼 發布:2025-05-11 00:08:22 瀏覽:115
斷牙腳本 發布:2025-05-11 00:04:21 瀏覽:68
sim卡的密碼怎麼設置密碼 發布:2025-05-10 23:41:09 瀏覽:716