Flutter应用程序能够发送数据到Docker容器中的UDP服务器,但无法接收来自服务器的数据
来到golang学习网的大家,相信都是编程学习爱好者,希望在这里学习Golang相关编程知识。下面本篇文章就来带大家聊聊《Flutter应用程序能够发送数据到Docker容器中的UDP服务器,但无法接收来自服务器的数据》,介绍一下,希望对大家的知识积累有所帮助,助力实战开发!
我目前正在 go 中开发后端 udp 服务,该服务与 flutter 移动应用进行通信。
这是 udp 服务代码:
package main
import (
"log"
"net"
"os"
"time"
)
func main() {
port := ":8080"
logger := log.new(os.stdout, "", log.ldate|log.ltime)
udp_server, err := net.resolveudpaddr("udp4", port)
if err != nil {
logger.fatalln(err.error())
return
}
udp_connection, err := net.listenudp("udp4", udp_server)
if err != nil {
logger.fatalln(err.error())
return
}
defer udp_connection.close()
buffer := make([]byte, 1024)
for {
n, addr, err := udp_connection.readfromudp(buffer)
if err != nil {
udp_connection.writetoudp([]byte("error reading from udp connection"), addr)
}
buffer_string := string(buffer[0:n])
time_sent := time.now()
time_sent_string := time_sent.string()
combined_string := buffer_string + time_sent_string
data := []byte(combined_string);
logger.println(combined_string);
_, err = udp_connection.writetoudp(data, addr)
if err != nil {
logger.fatalln(err.error())
return
}
}
}
到目前为止,该服务使用 docker 运行,可以接收从 flutter 应用发送的数据,但应用无法接收服务器发回的数据。
以下是用于接收和发送消息的 flutter 代码片段:
final socket = await rawdatagramsocket.bind(internetaddress.anyipv4, 0).onerror((error, stacktrace) => throw error assocketexception);
final server = internetaddress("10.0.2.2");
final port = 8080;
final data = [
deviceinfodata.deviceid,
datetime.now().toutc().tostring()
];
datetime current = datetime.now();
late datetime responsetime;
socket.send(data.tostring().codeunits, server, port);
string serverout = "";
socket.listen((event) {
final datagram = socket.receive();
if (datagram != null) {
// print("data sent to server: ${datagram.data}");
string message = string.fromcharcodes(datagram.data);
serverout = message.split("]").last;
log(message);
socket.close();
} else {
socket.close();
}
});
udp服务的dockerfile是:
# Specifies a parent image FROM golang:1.19.2-bullseye # Creates an app directory to hold your app’s source code WORKDIR /app # Copies everything from your root directory into /app COPY . . # Installs Go dependencies RUN go mod download # Builds your app with optional configuration RUN go build -o /udp-go # Tells Docker which network port your container listens on EXPOSE 8080 # Specifies the executable command that runs when the container starts CMD [ "/udp-go" ]
为了运行它,我使用以下命令:
docker 构建 --rm -t udp-go:alpha .docker run -d -p 8080:8080/udp --name go-udp udp-go:alpha
我使用/udp将容器中的udp端口映射到docker主机上的8080端口(https://docs.docker.com/config/containers/container-networking/)
但是,这仅允许我向服务发送数据。我知道这一点是因为检查 docker 日志显示该服务实际上正在接收数据。如果我要使用普通的旧 go run 而不是使用 docker 运行服务,则应用程序可以发送和接收消息。我该如何解决这个问题?
编辑:我尝试将 expose 8080\udp 添加到 dockerfile 而不仅仅是 expose 8080 但它仍然存在相同的错误。
正确答案
事实证明,这里的问题在于 flutter 代码本身。下面的代码片段是有效的代码片段。
final socket = await RawDatagramSocket.bind(InternetAddress.anyIPv4, 0).onError((error, stackTrace) => throw error asSocketException);
final server = InternetAddress("10.0.2.2");
final port = 8080;
final data = [
deviceInfoData.deviceId,
DateTime.now().toUtc().toString()
];
DateTime current = DateTime.now();
late DateTime responseTime;
socket.send(data.toString().codeUnits, server, port);
String serverOut = "";
socket.listen((event) {
final datagram = socket.receive();
if (datagram != null) {
// print("Data sent to server: ${datagram.data}");
String message = String.fromCharCodes(datagram.data);
serverOut = message.split("]").last;
log(message);
}
},
onDone: () => socket.close(),
);
使用 udp 代码时,我们必须关闭 ondone 上的套接字,而不是在监听时关闭套接字,因为 dart 可能尚未完全接收数据包。
好了,本文到此结束,带大家了解了《Flutter应用程序能够发送数据到Docker容器中的UDP服务器,但无法接收来自服务器的数据》,希望本文对你有所帮助!关注golang学习网公众号,给大家分享更多Golang知识!
错误:密码哈希化失败:hashedPassword 不匹配指定密码的哈希值
- 上一篇
- 错误:密码哈希化失败:hashedPassword 不匹配指定密码的哈希值
- 下一篇
- 在 cobra 中确保持久标志只被检索一次
-
- Golang · Go问答 | 7分钟前 |
- os.Root 路径校验仍失败时的相对路径规则
- 494浏览 收藏
-
- Golang · Go问答 | 19分钟前 | Go问答 · SetReadDeadline UDP ReadFrom UDP deadline Go UDP 超时
- UDP ReadFrom 不返回时的 deadline 设置方式
- 108浏览 收藏
-
- Golang · Go问答 | 24分钟前 |
- net.Resolver StrictErrors 处理部分解析结果
- 457浏览 收藏
-
- Golang · Go问答 | 32分钟前 |
- net.LookupIP 地址族顺序影响连接选择的排查
- 203浏览 收藏
-
- Golang · Go问答 | 39分钟前 |
- TLS 会话复用未命中时的缓存边界
- 270浏览 收藏
-
- Golang · Go问答 | 48分钟前 |
- TLS ServerName 缺失导致证书校验失败的修复
- 440浏览 收藏
-
- Golang · Go问答 | 57分钟前 | TLS · Go问答 · 兼容性 · tls Go tls.Config MinVersion MaxVersion
- TLS 最低版本配置与旧客户端兼容策略
- 440浏览 收藏
-
- Golang · Go问答 | 1小时前 |
- HTTP Transport 连接池不复用时的响应体处理
- 326浏览 收藏
-
- Golang · Go问答 | 1小时前 | HTTP · 故障排查 · net/http · Go问答 · 流式响应 · Go FLUSH ResponseController ResponseWriter 代理缓冲 HTTP流式响应
- ResponseController Flush 后客户端仍无数据的原因
- 108浏览 收藏
-
- Golang · Go问答 | 1小时前 |
- HTTP 重定向后认证头丢失的客户端策略
- 435浏览 收藏
-
- Golang · Go问答 | 1小时前 | go并发 · Go 可见性 atomic.Pointer 并发配置
- 原子指针替换配置对象时的可见性边界
- 204浏览 收藏
-
- Golang · Go问答 | 1小时前 |
- atomic.Uint64 对齐要求在旧结构体中的处理
- 268浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 485次学习
-
- PubMedQA
- 深入了解PubMedQA生物医学问答数据集,涵盖其核心功能、使用方法及在临床决策、药物研发等场景的应用,助力提升NLP模型性能。
- 406次使用
-
- H2O EvalGPT
- H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。
- 483次使用
-
- LMArena
- LMArena是加州大学伯克利分校推出的AI模型匿名评测平台。通过盲测投票机制,用户可对比不同大模型回答并生成实时排行榜,助力开发者优化模型及用户选择最佳AI工具。
- 493次使用
-
- HELM
- 深入了解斯坦福推出的HELM(Holistic Evaluation of Language Models)大模型评测体系。本文解析其核心功能、安装配置步骤及应用场景,涵盖准确性、公平性、鲁棒性等多维度指标,助力开发者全面优化语言模型性能。
- 437次使用
-
- MMBench
- MMBench是由上海人工智能实验室等机构联合推出的多模态基准测试平台,提供细粒度能力评估、大规模数据集及VLMEvalKit工具。本文详细介绍其核心功能、安装使用方法及应用场景,助力开发者全面评估多模态模型性能。
- 264次使用
-
- 用Nginx反向代理部署go写的网站。
- 2023-01-17 502浏览
-
- GoLand调式动态执行代码
- 2023-01-13 502浏览
-
- Go crypto/rand.Text 的长度为什么不是固定字符数
- 2026-10-04 501浏览
-
- Go strings.ToValidUTF8 清洗日志内容的边界
- 2026-10-03 501浏览
-
- Go tls.GetCertificate 为什么收不到空 ServerName 请求
- 2026-09-27 501浏览

