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()。如果仔细查看代码,您可以找到它。不,你不是。我为什么要告诉你?很抱歉。你是说我应该为多个请求创建请求池?如果是这样的话,会有什么帮助?我的意思是,若启动了第二个请求,那个么客户端也将首先获得头,以此类推。同样的进程将继续下去。请纠正我的错误,并就这些问题提供您的意见。