GO语言实现P2P网络-客户端实现并且运行和测试
持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第8天,点击查看活动详情
GO语言实现P2P网络
客户端实现
1、支持服务器参数化
go fun main(){ //设定参数 if len(os.Args)<5{ fmt.Println("./client tag remoteIP remotePort") return } //本地绑定端口 port,_:=strconv.Atoi(os.Args[4]) //客户端标识 tag:=os.Args[1] //服务器IP remoteIP:=os.Args[2] //服务器端口 remotePort,_:=strconv.Atoi(os.Args[3]) //绑定本地端口 localAddr:=net.UDPAddr{Port: port} //与服务器建立联系 conn,err:=net.DialUDP("udp",&localAddr,&net.UDPAddr{IP:net.ParseIP(remoteIP),Port:remotePort}) if err!=nil{ log.Panic("UDP拨号失败") }
2、请求与服务器建立连接(发送一个消息)
```go conn,err:=net.DialUDP("udp",&localAddr,&net.UDPAddr{IP:net.ParseIP(remoteIP),Port:remotePort})
if err!=nil{ log.Panic("UDP拨号失败") } ```
3、从服务器中获得另一个客户端地址,准备通信。
parseAddr是下面步骤构造的函数,不是net/mail包中的函数 p2p也是下面构造的函数中 第一步和第二步同时main函数中 go //发送消息,提供身份 conn.Write([]byte("I am SEVERA"+tag)) //从服务器中获得目标地址 buf:=make([]byte,256) n,_,err:=conn.ReadFromUDP(buf) if err!=nil{ log.Panic("读取消息失败",err) } conn.Close() toAddr:=parseAddr(string(buf[:n])) p2p(&localAddr,&toAddr) }
4、parseAddr解析服务器消息的代码(实际是为了搞到对方的地址)
go func parseAddr(addr string)net.UDPAddr{ t:=strings.Split(addr,":") port,_:=strconv.Atoi(t[1]) return net.UDPAddr{ IP:net.ParseIP(t[0]), Port: port, } }
p2p通信
```go func p2p(srcAddr *net.UDPAddr,dstAddr *net.UDPAddr){ //请求建立联系 conn,:=net.DialUDP("udp",srcAddr,dstAddr) //发送打洞消息 conn.Write([]byte("打洞消息")) //启动goroutine监控标准输入 go func(){ buf:=make([]byte,256) for{ //接受UDP消息打印 n,,_:=conn.ReadFromUDP(buf) if n>0{ fmt.Printf("收到消息:%sp2p>",buf[:n]) }
} }() reader:=bufio.NewReader(os.Stdin) for{ fmt.Printf("p2p>") //读取标准输入,以换行为读取标志 data,_:=reader.ReadString('\n') conn.Write([]byte(data)) } } ```
运行和测试
1、开启服务器
输入命令:go run 服务的名称.go
2、开启客户端(至少两个)
输入命令: go run serverP2P.go name localhost 服务器port 8081 输入命令: go run serverP2P.go name2 localhost 服务器port 8082
3、随意发送消息
随意输入
4、服务器可挂断
挂断服务器,就能够运行了。
5、运行效果
GO语言实现P2P网络-客户端实现并且运行和测试相关推荐
- GO语言实现P2P网络-服务端代码实现
持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第7天,点击查看活动详情 GO语言实现P2P网络 P2P是区块链节点通信的基础协议,使用起来比TCP协议要麻烦一些.因为通信的两个节 ...
- 第10讲 | 深入区块链技术(二):P2P网络
在上一篇文章中,我大致讲解了一下区块链技术的几个核心要素.P2P网络协议.分布式一致性算法(共识机制).加密签名算法.账户与存储模型.今天我们就来看看区块链技术的第一个核心要素:P2P网络. 如果我们 ...
- 使用Go语言编写区块链P2P网络(译)
外文发表日期: 2018-04-14 外文链接:https://medium.com/coinmonks/code-a-simple-p2p-blockchain-in-go-46662601f417 ...
- 干货!如何用Node.js实现一个精巧的P2P网络
加密货币都是去中心化的应用,去中心化的基础就是P2P网络,其作用和地位不言而喻,无可替代.当然,对于一个不开源的所谓私链(私有区块链),是否必要,尚无定论. 事实上,P2P网络不是什么新技术.但是,使 ...
- golang打造p2p网络
就像1000个人眼中有1000个哈姆雷特一样,每个人眼中的区块链也是不一样的!作为技术人员眼中的区块链就是将各种技术的融合,包括密码学,p2p网络,分布式共识机制以及博弈论等.我们今天就来讨论一下区块 ...
- 解析一下p2p网络的原理?
P2P 全称是 Peer to Peer ,翻译成中文"地位对等的两个节点之间",亦或者"点对点".区别于现在诸多 "C/S"(客户端/服务 ...
- 【转】 P2P网络文件共享系统及开发平台调研报告
P2P网络文件共享系统及开发平台调研报告 1.P2P网络的定义 P2P(Peer to Peer)即对等计算或对等网络,通常简称P2P,可以简单的定义成通过直接交换,共享计算机资源和服务.在P2P网络 ...
- 发布一个嘿嘿嘿的技术方案 —— 商用群发p2p网络
目前反群发的主要技术措施有: (1) 帐号控制:有帐号才能发,同时限制帐号的发送频率 (2) IP控制:限制指定IP的发送频率 (3) 协议控制:采用非开放协议 ( ...
- P2P网络“自由”穿越NAT的“秘密”
P2P网络"自由"穿越NAT的"秘密"<?xml:namespace prefix = o ns = "urn:schemas-microsof ...
最新文章
- 我们不知道答案的125个科学问题(16)群体合作行为的演化
- 亲近自然的加州玻璃豪宅
- 经典面试题:Redis 内存满了怎么办?
- Java 8中最快的垃圾收集器是什么?
- java把收集的数据节点_java面试题收集(04)
- 今天升级Xcode 7.0 bata发现网络访问失败。
- java对列表数据排序_如何在Java中对列表进行排序
- CMD/Dos下远程开启3389与远程改3389端口
- 质因数分解 2012年NOIP全国联赛普及组
- 测试版降级后软件还在么,2分钟告诉你如何将iOS测试版降级到正式版本
- 适合入门的linux教程,Linux入门记录系列教程,适合Linux初学者阅读
- 7、微信小程序-wxs脚本
- php 页面字体大小,网页中各种设置字体大小的方法总结
- STM32F4外部中断
- winform 中自定义有透明度的panel,可用于加载遮盖层
- 分享qq,wx,qqZone,weibo基于vue
- GPON学习总结--gemport mapping
- IDL对FY-4A辐射定标
- 【软考】系统集成项目管理工程师(十五)项目采购管理
- 百度广告产品系统级测试技术演进