我在我的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