gpt4 book ai didi

websocket - 在 Pharo 2.0 中使用pharo、ZnWebsocket 和Fuel 通过websocket 发送文件?

转载 作者:行者123 更新时间:2023-12-05 00:28:11 26 4
gpt4 key购买 nike

我正在尝试使用 Pharo 2.0 和 Zinc Websocket 通过 websocket 发送相当大的视频文件。这是 pharo 到 pharo 转移。

我徒劳地试图让它发挥作用。我确定我缺少一个非常简单的解决方案。谢谢你的帮助。

编辑:更新:我确实通过以下代码使其正常工作:

myStream :=   
(FileStream oldFileNamed: 'big_buck_bunny_480p_surround-fix.avi') .
bytes := myStream next: myStream size.
myStream close.
myStream := nil.
server distributeMessage: bytes.

testConnect
| websocket1 receivedFile|
websocket1 := ZnWebSocket to: 'ws://192.168.1.102:1701/ws-chatroom'.
testProcess := [
[
| mes |
mes := [ websocket1 readMessage ]
on: ConnectionTimedOut
do: [ nil ].
mes
ifNotNil: [
Transcript
show: 'Message received in client';cr .
receivedFile := FileStream newFileNamed: 'receivedFile3.avi'.
receivedFile nextPutAll: mes.
receivedFile close.
] ] repeat ] fork

但是,它不适用于大于约 500 兆字节的文件,因为 Pharo 内存不足。

除非有人有一个很好的建议来让它工作,否则我将切换齿轮并尝试使用 ZincHTTPComponents 提供文件,并且可能向远程计算机发送一条消息,其中包含要在网络服务器上下载的文件的位置。

编辑: 重要警告 /更新:

我和 Sven 讨论了这个问题,他为 pharo smalltalk 编写了 Zinc websocket 包。他告诉我通过 websocket 发送大文件并不是一个真正可行的想法。事实上,即使我实现了下面的解决方案,最终文件每次都会偏离几个字节。

我通过执行我的计划 B 解决了我的问题:使用 Zinc HTTP 组件通过 HTTP 提供文件并使用客户端获取,例如:
FileStream 
newFileNamed: '/tmp/cog.tgz'
do: [ :stream | | entity |
stream binary.
entity := ZnClient new
streaming: true;
get: 'https://ci.lille.inria.fr/pharo/job/Cog%20Git%20Tracker/lastSuccessfulBuild/artifact/cog.tar.gz';
entity.
entity writeOn: fileStream ]

最佳答案

内存不足的原因是在处理之前将整个文件读入内存。由于无论如何您只能通过线路发送数据块,因此您也应该一次只读取一个块(这就是流的用途)。所以而不是这个:

myStream :=   
(FileStream oldFileNamed: 'big_buck_bunny_480p_surround-fix.avi').
bytes := myStream next: myStream size.
myStream close.

你应该使用这样的东西:
blockSize := 128.
myStream :=
(FileStream oldFileNamed: 'big_buck_bunny_480p_surround-fix.avi') .
[ myStream atEnd ] whileFalse: [
bytes := myStream next: blockSize.
"process your bytes here" ].
myStream close.

甚至更好:使用便利块自动关闭流:
blockSize := 128.  
FileStream
oldFileNamed: 'big_buck_bunny_480p_surround-fix.avi'
do: [ :stream |
[ stream atEnd ] whileFalse: [
bytes := stream next: blockSize.
"process your bytes here" ].

编辑

从您的评论中回答问题:如果您查看 FileStream>>next:您将看到以下几行:
...
[self atEnd ifTrue:
[(howManyRead + 1) to: anInteger do: [:i | newCollection at: i put: (self next)].
^newCollection].
...

这意味着如果您要求的数量超过可用的数量,您只需将流的其余部分拖到最后即可。

关于websocket - 在 Pharo 2.0 中使用pharo、ZnWebsocket 和Fuel 通过websocket 发送文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19213514/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com