持续创作,加速成长!这是我参与「掘金日新计划 · 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网络-客户端实现并且运行和测试相关推荐

  1. GO语言实现P2P网络-服务端代码实现

    持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第7天,点击查看活动详情 GO语言实现P2P网络 P2P是区块链节点通信的基础协议,使用起来比TCP协议要麻烦一些.因为通信的两个节 ...

  2. 第10讲 | 深入区块链技术(二):P2P网络

    在上一篇文章中,我大致讲解了一下区块链技术的几个核心要素.P2P网络协议.分布式一致性算法(共识机制).加密签名算法.账户与存储模型.今天我们就来看看区块链技术的第一个核心要素:P2P网络. 如果我们 ...

  3. 使用Go语言编写区块链P2P网络(译)

    外文发表日期: 2018-04-14 外文链接:https://medium.com/coinmonks/code-a-simple-p2p-blockchain-in-go-46662601f417 ...

  4. 干货!如何用Node.js实现一个精巧的P2P网络

    加密货币都是去中心化的应用,去中心化的基础就是P2P网络,其作用和地位不言而喻,无可替代.当然,对于一个不开源的所谓私链(私有区块链),是否必要,尚无定论. 事实上,P2P网络不是什么新技术.但是,使 ...

  5. golang打造p2p网络

    就像1000个人眼中有1000个哈姆雷特一样,每个人眼中的区块链也是不一样的!作为技术人员眼中的区块链就是将各种技术的融合,包括密码学,p2p网络,分布式共识机制以及博弈论等.我们今天就来讨论一下区块 ...

  6. 解析一下p2p网络的原理?

    P2P 全称是 Peer to Peer ,翻译成中文"地位对等的两个节点之间",亦或者"点对点".区别于现在诸多 "C/S"(客户端/服务 ...

  7. 【转】 P2P网络文件共享系统及开发平台调研报告

    P2P网络文件共享系统及开发平台调研报告 1.P2P网络的定义 P2P(Peer to Peer)即对等计算或对等网络,通常简称P2P,可以简单的定义成通过直接交换,共享计算机资源和服务.在P2P网络 ...

  8. 发布一个嘿嘿嘿的技术方案 —— 商用群发p2p网络

    目前反群发的主要技术措施有: (1)       帐号控制:有帐号才能发,同时限制帐号的发送频率 (2)       IP控制:限制指定IP的发送频率 (3)       协议控制:采用非开放协议 ( ...

  9. P2P网络“自由”穿越NAT的“秘密”

    P2P网络"自由"穿越NAT的"秘密"<?xml:namespace prefix = o ns = "urn:schemas-microsof ...

最新文章

  1. 我们不知道答案的125个科学问题(16)群体合作行为的演化
  2. 亲近自然的加州玻璃豪宅
  3. 经典面试题:Redis 内存满了怎么办?
  4. Java 8中最快的垃圾收集器是什么?
  5. java把收集的数据节点_java面试题收集(04)
  6. 今天升级Xcode 7.0 bata发现网络访问失败。
  7. java对列表数据排序_如何在Java中对列表进行排序
  8. CMD/Dos下远程开启3389与远程改3389端口
  9. 质因数分解 2012年NOIP全国联赛普及组
  10. 测试版降级后软件还在么,2分钟告诉你如何将iOS测试版降级到正式版本
  11. 适合入门的linux教程,Linux入门记录系列教程,适合Linux初学者阅读
  12. 7、微信小程序-wxs脚本
  13. php 页面字体大小,网页中各种设置字体大小的方法总结
  14. STM32F4外部中断
  15. winform 中自定义有透明度的panel,可用于加载遮盖层
  16. 分享qq,wx,qqZone,weibo基于vue
  17. GPON学习总结--gemport mapping
  18. IDL对FY-4A辐射定标
  19. 【软考】系统集成项目管理工程师(十五)项目采购管理
  20. 百度广告产品系统级测试技术演进

热门文章

  1. 使用 MoveIt 控制自己的真实机械臂【3】——优化轨迹发给真实机械臂执行
  2. FPGA 结构分析 -IO 资源
  3. 【Python】Python脚本命令行解析
  4. 内存映射I/O与端口映射I/O的区别
  5. 【火灾检测】森林火灾检测系统(带面板)【含GUI Matlab源码 1921期】
  6. K-means,K-means++方法详解-机器学习分类问题常见算法
  7. suse 15破解root密码
  8. 数据库连接不上的几种情况
  9. 自动化测试工程师的发展前景怎么样?
  10. PX4无人机-Gazebo仿真实现移动物体的跟踪