首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Golang使用不同IP的两个程序之间进行通信

如何在Golang使用不同IP的两个程序之间进行通信
EN

Stack Overflow用户
提问于 2022-08-01 08:25:15
回答 2查看 207关注 0票数 0

有人能给我推荐一种通信协议吗?它可以将两个Golang程序与不同的IP地址(其他设备)连接起来?因为当我在Golang中使用Socket编程时,它只能连接本地主机上的程序。

EN

回答 2

Stack Overflow用户

发布于 2022-08-01 10:45:17

如果您想在您的家庭网络上运行一台服务器,该服务器可能在NAT之后,并首先从您的家庭网络外部连接到它:您需要将您的服务器套接字绑定到您的本地ip地址,这可能类似于192.168.然后再听一遍:当网络之外的系统向您的服务器发送数据包时,它们会将它发送给您的公共Ip,您可以在googling上搜索“什么是我的ip”,因此您的路由器不知道它应该转发什么本地ip地址,这就是为什么您需要进行端口转发,这就是为什么您需要进行端口转发,这基本上告诉路由器“当您收到端口上的数据包"n”时,将它发送到一个具有“x.x”ip地址的系统。

因此,如果本地ip为192.168.1.10,公共ip为5.68.125.48,并且在路由器设置页面上侦听端口8080,将端口8080转发到192.168.1.10,然后在客户端将数据包连接并发送到5.68.125.48:8080,现在路由器知道本地网络上的谁应该接收数据包。

票数 1
EN

Stack Overflow用户

发布于 2022-08-01 10:48:49

您可以尝试这样的解决方案:

代码语言:javascript
复制
package main

import (
    "bufio"
    "fmt"
    "net"
    "strconv"
    "time"
)

func main() {
    fmt.Println("Server started...")
    ln, err := net.Listen("tcp", ":8000")
    if err != nil {
        fmt.Println("Error starting socket server: " + err.Error())
    }
    for {
        conn, err := ln.Accept()
        if err != nil {
            fmt.Println("Error listening to client: " + err.Error())
            continue
        }
        fmt.Println(conn.RemoteAddr().String() + ": client connected")
        go receiveData(conn)
        go sendData(conn)
    }
}

func sendData(conn net.Conn) {
    i := 0
    for {
        _, err := fmt.Fprintf(conn, strconv.Itoa(i)+". data from server\n")
        i++
        if err != nil {
            fmt.Println(conn.RemoteAddr().String() + ": end sending data")
            return
        }
        time.Sleep(time.Duration(1) * time.Second)
    }
}

func receiveData(conn net.Conn) {
    for {
        message, err := bufio.NewReader(conn).ReadString('\n')
        if err != nil {
            fmt.Println(conn.RemoteAddr().String() + ": client disconnected")
            conn.Close()
            fmt.Println(conn.RemoteAddr().String() + ": end receiving data")
            return
        }
        fmt.Print(conn.RemoteAddr().String() + ": received " + message)
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73190830

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档