【Go语言】基于Socket编程的P2P通信程序示例

Go语言的Socket编程实现为开发者提供了一种高效且强大的方式来实现网络通信。通过Go语言的并发模型和内置的网络库,如net包,开发者可以轻松地创建基于套接字的通信应用。Go语言的goroutine和channel机制使并发处理变得简单,能够轻松处理多个连接和数据交换。使用Go语言进行Socket编程,开发者可以初始化和监听端口,接受连接请求,建立直接的点对点通信通道,并在不同节点之间进行数据传输。这种方式使得开发者能够构建出鲁棒、高性能的P2P通信应用,同时充分利用了Go语言在并发编程方面的优势。

"P2P"代表"点对点"(Peer-to-Peer)的缩写,它是一种网络通信和数据共享模式。在传统的客户端-服务器模型中,计算机系统(客户端)通过向中央服务器请求数据来进行通信和数据交换。而在P2P模型中,计算机之间可以直接相互连接,共享资源和信息,而无需依赖一个中央服务器。

player1.go

go 复制代码
package main

import (
	"bufio"
	"fmt"
	"net"
	"os"
)

func handleIncomingMessages(conn net.Conn) {
	scanner := bufio.NewScanner(conn)
	for scanner.Scan() {
		text := scanner.Text()
		fmt.Printf("Received from Player 2: %s\n", text)
	}
}

func main() {
    // player1做服务端监听
	listener, _ := net.Listen("tcp", "127.0.0.1:9001")
	defer listener.Close()

	fmt.Println("Player 1 waiting for a match on 127.0.0.1:9001")

	conn, _ := listener.Accept()
	defer conn.Close()

	fmt.Println("Player 1 connected to Player 2")
	
    // player1的接收
	go handleIncomingMessages(conn)
	
    // player1的发送
	scanner := bufio.NewScanner(os.Stdin)
	for scanner.Scan() {
		text := scanner.Text()
		fmt.Fprintf(conn, "%s\n", text)
	}
}

player2.go

go 复制代码
package main

import (
	"bufio"
	"fmt"
	"net"
	"os"
)

func handleIncomingMessages(conn net.Conn) {
	scanner := bufio.NewScanner(conn)
	for scanner.Scan() {
		text := scanner.Text()
		fmt.Printf("Received from Player 1: %s\n", text)
	}
}

func main() {
    // player2做客户端连接服务端
	conn, _ := net.Dial("tcp", "127.0.0.1:9001")
	defer conn.Close()

	fmt.Println("Player 2 connected to Player 1")
	
    // player2的接收
	go handleIncomingMessages(conn)
	
    // player2的发送
	scanner := bufio.NewScanner(os.Stdin)
	for scanner.Scan() {
		text := scanner.Text()
		fmt.Fprintf(conn, "%s\n", text)
	}
}
for scanner.Scan() {
		text := scanner.Text()
		fmt.Fprintf(conn, "%s\n", text)
	}
}
相关推荐
前端世界21 分钟前
ASP.NET ListBox控件多选实战:3步打造高效兴趣收集系统
后端·asp.net
海奥华224 分钟前
go中的接口返回设计思想
开发语言·后端·golang
飞川撸码5 小时前
【LeetCode 热题100】网格路径类 DP 系列题:不同路径 & 最小路径和(力扣62 / 64 )(Go语言版)
算法·leetcode·golang·动态规划
roman_日积跬步-终至千里12 小时前
【Go语言基础【14】】defer与异常处理(panic、recover)
golang
孔令飞13 小时前
Kubernetes 节点自动伸缩(Cluster Autoscaler)原理与实践
ai·云原生·容器·golang·kubernetes
我的golang之路果然有问题19 小时前
云服务器部署Gin+gorm 项目 demo
运维·服务器·后端·学习·golang·gin
孔令飞20 小时前
Go 为何天生适合云原生?
ai·云原生·容器·golang·kubernetes
YGGP1 天前
吃透 Golang 基础:数据结构之 Map
开发语言·数据结构·golang
march of Time1 天前
go工具库:hertz api框架 hertz client的使用
开发语言·golang·iphone
[email protected]1 天前
ASP.NET Core SignalR - 部分客户端消息发送
后端·asp.net·.netcore