如何防止TCP数据包被丢弃?

Nic*_*ick 0 java udp network-programming tcp node.js

我正在Android手机上创建一个程序,将摄像机的输出发送到同一网络上的服务器.这是我的Java代码:

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);
        }
Run Code Online (Sandbox Code Playgroud)

服务器是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()
Run Code Online (Sandbox Code Playgroud)

我的终端显示大约1.5 fps(5 Mbps).我对网络编程知之甚少,但我知道应该有足够的带宽.每个图像为640x480x1.5,18 fps,约为63 Mbps.本地网络应该能够很容易地处理这个问题,但我在Android中的调试器给了我很多"拒绝连接"的消息.

任何有关修复我的糟糕网络实践的帮助都会很棒.(我将稍微进行图像压缩 - 但是现在我需要优化这一步骤).

Dav*_*rtz 5

您已经设计了系统,因此它必须完成比它应该做的工作多很多倍的工作.您需要为每个传输的帧建立和拆除连接.这不仅会扼杀您的吞吐量,还会让您失去资源.

通过合理的设计,传输帧所需的全部内容是发送和接收帧数据.根据您的设计,对于每个帧,必须建立TCP连接(3个步骤),必须发送和接收帧数据,并且必须拆除TCP连接.更糟糕的是,接收器无法知道它已经接收到所有帧数据,直到发生连接关闭.所以这不能隐藏在后台.

设计一个理智的协议,问题将消失.