我在我的Android手机上创建一个程序,将相机的输出发送到同一网络上的服务器。这是我的Java代码:如何保持TCP数据包不被丢弃?
camera.setPreviewCallbackWithBuffer(new Camera.PreviewCallback() {
public void onPreviewFrame(byte[] data, Camera cam) {
try {
socket = new Socket("XXX.XXX.XXX.XXX", 3000);
out = socket.getOutputStream();
out.write(data);
socket.close();
} catch (Exception e) {
e.printStackTrace();
}
camera.addCallbackBuffer(data);
}
该服务器是服务器的NodeJS:
time = 0
video_server.on 'connection', (socket) ->
buffer = []
socket.on 'data', (data) ->
buffer.push data
socket.on 'end', ->
new_time = (new Date()).getTime()
fps = Math.round(1000/(new_time - time)*100)/100
console.log fps
time = new_time
stream = fs.createWriteStream 'image.jpg'
stream.on 'close', ->
console.log 'Image saved.', fps
stream.write data for data in buffer
stream.end()
我的终端显示约1.5 FPS(5 Mbps)的。我对网络编程知之甚少,但我确实知道应该有足够的带宽。每张图像在18 fps时为640x480x1.5,约为63 Mbps。本地网络应该很容易处理,但我的Android调试器给了我很多“连接被拒绝”的消息。
任何帮助解决我的不良网络做法将是伟大的。 (我会稍微进行图像压缩 - 但现在我需要优化这一步)。
为什么你一直打开和关闭TCP连接? –
学会玩弄? – Dave
这里没有证据表明TCP数据包完全被丢弃,'连接被拒绝'与带宽或丢包没有任何关系。您的代码在将任何文件写入文件之前将接收到的图像毫无意义地累积在内存中,这会浪费时间和空间。 – EJP