有人能给我推荐一种通信协议吗?它可以将两个Golang程序与不同的IP地址(其他设备)连接起来?因为当我在Golang中使用Socket编程时,它只能连接本地主机上的程序。
发布于 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,现在路由器知道本地网络上的谁应该接收数据包。
发布于 2022-08-01 10:48:49
您可以尝试这样的解决方案:
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)
}
}https://stackoverflow.com/questions/73190830
复制相似问题