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

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

P2pimg.drawio

player1.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: %sn", 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, "%sn", text)
	}
}

player2.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: %sn", 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, "%sn", text)
	}
}
for scanner.Scan() {
		text := scanner.Text()
		fmt.Fprintf(conn, "%sn", text)
	}
}

原文地址:https://blog.csdn.net/qq_22328011/article/details/132427452

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_47128.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注