通过Phro 2.0中的pharo,ZnWebsocket和Fuel通过websocket发送文件吗?

禅宗

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

我白费力气让它起作用。我敢肯定我缺少一个非常简单的解决方案。谢谢你的帮助。

编辑:更新:我确实通过以下代码使它起作用:

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 MB的文件,因为Pharo内存不足。

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

编辑:重要警告/更新:

我与Sven讨论了这个问题,后者为pharo smalltalk编写了Zinc Websocket程序包。他告诉我,通过websocket发送大文件并不是一个切实可行的想法。的确,即使我实现了以下解决方案,最终文件每次也会丢失几个字节。

我通过执行计划B解决了我的问题:使用Zinc HTTP组件并使用客户端get通过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].
...

这意味着,如果您要求的资源超过可用的资源,那么您只需将流的其余部分一直流到最后。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

从通过ZF2中的rest请求发送的多部分数据中获取文件内容

来自分类Dev

AngularJS:如何通过 websocket 发送文件?

来自分类Dev

Yii 2:无法通过邮件发送日志

来自分类Dev

尝试通过python和pandas比较2个excel文件

来自分类Dev

wso2esb 5.0-通过WebSocket将消息从WSO2发送到客户端

来自分类Dev

在Yii2中通过Ajax上传不包括文件

来自分类Dev

通过模板合并2个文件记录

来自分类Dev

在WSO2 Carbon中通过svn commit通过评论

来自分类Dev

通过JSON通过Draw2D.js touch中的连接保存和还原矩形

来自分类Dev

通过websocket发送RabbitMQ消息

来自分类Dev

通过websocket发送RabbitMQ消息

来自分类Dev

通过组件导航-Angular 2

来自分类Dev

通过 2 个接口路由

来自分类Dev

通过websocket发送文本和二进制

来自分类Dev

通过OnInit在Angular 2中测试Promise

来自分类Dev

通过EC2中的iPXE引导

来自分类Dev

通过Retrofit2将文件发送到服务器作为对象

来自分类Dev

通过WiFi P2P发送简单的字符串而不是文件

来自分类Dev

WSO2 ESB 发送文件通过 HTTP api 解析无响应

来自分类Dev

通过WebRequest发送文件

来自分类Dev

通过serversocket发送文件

来自分类Dev

通过netcat发送文件

来自分类Dev

通过rabbitmq发送文件

来自分类Dev

通过发送SIGUSR1停止进程,并通过发送SIGUSR2唤醒

来自分类Dev

在Perl中通过UDP发送文件

来自分类Dev

在PHP中通过SOAP发送Zip文件

来自分类Dev

通过bestream中的curl发送文件

来自分类Dev

在 .Net 中通过 TCP 发送大文件

来自分类Dev

从 Starlette 中的同步迭代器通过 websocket 发送数据