我正在尝试使用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] 删除。
我来说两句