Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 安卓本地视频服务器_Android_Websocket_Video Streaming_Localserversocket - Fatal编程技术网

Android 安卓本地视频服务器

Android 安卓本地视频服务器,android,websocket,video-streaming,localserversocket,Android,Websocket,Video Streaming,Localserversocket,我试图使一个本地网络服务器使用套接字,将流视频 以下是我的服务器代码: class VideoStreamServer { public void startServer() { outFile = new File(outFilePath); Runnable videoStreamTask = new Runnable() { @Override public v

我试图使一个本地网络服务器使用套接字,将流视频

以下是我的服务器代码:

class VideoStreamServer {

        public void startServer() {
            outFile = new File(outFilePath);
            Runnable videoStreamTask = new Runnable() {
                @Override
                public void run() {
                    try {
                        ServerSocket socket = new ServerSocket(port);
                        StringBuilder sb = new StringBuilder();
                        sb.append( "HTTP/1.1 200 OK\r\n");
                        sb.append( "Content-Type: audio/mpeg\r\n");
                        sb.append( "Connection: close\r\n" );
                        sb.append( "Accept-Ranges: bytes\r\n" );
                        sb.append( "Content-Length: " + outFile.length() + "\r\n" );
                        sb.append( "\r\n");


                        System.out.println("Waiting for client to connect.");
                        while (true) {
                            Socket client = socket.accept();
                            System.out.println("Thread Started");
                            BufferedOutputStream os = new BufferedOutputStream(client.getOutputStream());
                            FileInputStream in = new FileInputStream(outFile);
                            byte[] data = new byte[1024];
                            int length;
                            //System.setProperty("http.keepAlive", "false");
                            os.write(sb.toString().getBytes());
                            while ((length = in.read(data)) != -1){
                                os.write(data,0,length);
                            }
                            os.flush();
                            os.close();
                            socket.close();
                        }
                    } catch (IOException e) {
                        e.printStackTrace();
                    }

                }
            };

            Thread streamServer = new Thread(videoStreamTask);
            streamServer.start();
        }

    }
所以问题是,每当我在web浏览器中点击url时,就会抛出以下异常

java.net.SocketException: sendto failed: EPIPE (Broken pipe)
     at libcore.io.IoBridge.maybeThrowAfterSendto(IoBridge.java:499)
     at libcore.io.IoBridge.sendto(IoBridge.java:468)
     at java.net.PlainSocketImpl.write(PlainSocketImpl.java:508)
     at java.net.PlainSocketImpl.access$100(PlainSocketImpl.java:46)
     at java.net.PlainSocketImpl$PlainSocketOutputStream.write(PlainSocketImpl.java:270)
     at java.io.BufferedOutputStream.flushInternal(BufferedOutputStream.java:185)
     at java.io.BufferedOutputStream.write(BufferedOutputStream.java:139)
     at com.example.sachinchandil.myapplication.VideoStreamDownloaderFragment$VideoStreamServer$1.run(VideoStreamDownloaderFragment.java:285)
     at java.lang.Thread.run(Thread.java:841)
 Caused by: libcore.io.ErrnoException: sendto failed: EPIPE (Broken pipe)
     at libcore.io.Posix.sendtoBytes(Native Method)
     at libcore.io.Posix.sendto(Posix.java:156)
     at libcore.io.BlockGuardOs.sendto(BlockGuardOs.java:177)
     at libcore.io.IoBridge.sendto(IoBridge.java:466)
    ... 7 more

如果我使用
HttpUrlConnection
下载此文件,则会下载所有字节帧,但最后一个字节帧除外,并引发相同的异常

连接客户端后,您应该先读取输入流,然后再写入输出。我认为。@Greenapps如果仔细阅读代码,您也可以找到它。您在写入标题后读取输入流。客户端可能还没有准备好读取(它可能会被第一次写入操作阻塞)。我也有过客户端应用程序的经验,它在读取第一个连接的标题后试图打开第二个连接,但第一个连接并没有立即关闭(这是MediaPlayer在某些特定Android设备上的实现)。您的代码被一个连接阻止,不接受另一个连接。在获得Socket客户端后,可能需要另一个线程进行通信,因此可以等待另一个Socket.accept()。
如果仔细查看代码,您可以找到它。不,你不是。我为什么要告诉你?很抱歉。你是说我应该为多个请求创建请求池?如果是这样的话,会有什么帮助?我的意思是,若启动了第二个请求,那个么客户端也将首先获得头,以此类推。同样的进程将继续下去。请纠正我的错误,并在这些查询中提供您的输入。连接客户端后,您应该先读取输入流,然后再写入输出。我认为。@Greenapps如果您仔细阅读代码,您也可以找到它。您在写入标题后读取输入流。客户端可能还没有准备好读取(它可能会被第一次写入操作阻塞)。我也有过客户端应用程序的经验,它在读取第一个连接的标题后试图打开第二个连接,但第一个连接并没有立即关闭(这是MediaPlayer在某些特定Android设备上的实现)。您的代码被一个连接阻止,不接受另一个连接。在获得Socket客户端后,可能需要另一个线程进行通信,因此可以等待另一个Socket.accept()。
如果仔细查看代码,您可以找到它。不,你不是。我为什么要告诉你?很抱歉。你是说我应该为多个请求创建请求池?如果是这样的话,会有什么帮助?我的意思是,若启动了第二个请求,那个么客户端也将首先获得头,以此类推。同样的进程将继续下去。请纠正我的错误,并就这些问题提供您的意见。