尝试写入文件时出现Broken Pipe异常

时间:2012-07-10 01:49:52

标签: java http sockets

我正在尝试编写一个非常简单的应用程序,它将通过PUT请求将视频上传到我的服务器之一。这是我的代码的样子:

socket = new Socket();
socket.connect(new InetSocketAddress(ticket.getHost(), 80));

outputStream = socket.getOutputStream();

// begin forming the request
outputStream.write(("PUT " + ticket.getEndpoint() + " HTTP/1.1\r\n" +
        "Host: " + ticket.getHost() + "\r\n" + 
        "Content-Length: " + getStreamFile().length() + "\r\n" +
        "Content-Type: video/mp4\r\n\r\n").getBytes());

// now, let's write us some binary data
fileInputStream = new FileInputStream(getStreamFile());
inputStream = new BufferedInputStream(fileInputStream);

byte[] fileBytes = new byte[1024];
int bytesRead = 0;
int totalBytesRead = 0;

while ((bytesRead = inputStream.read(fileBytes)) > 0) {
    outputStream.write(fileBytes, 0, bytesRead);

    totalBytesRead += bytesRead;

    notifyListenersOnProgress((double)totalBytesRead / (double)getStreamFile().length());
}

非常简单,对吧?直到我在大约两个循环之后看到这个错误:

java.net.SocketException: Broken pipe
    at java.net.SocketOutputStream.socketWrite0(Native Method) ~[na:1.6.0_23]   
    at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:109) ~[na:1.6.0_23]
    at java.net.SocketOutputStream.write(SocketOutputStream.java:141) ~[na:1.6.0_23]

我在这里做错了什么?

3 个答案:

答案 0 :(得分:0)

不确定这是否是问题,但您在\r\n之后错过了第二个video/mp4

您还应该修改write调用,以便只写入数组的第一个bytesRead字节。

答案 1 :(得分:0)

套接字的接收端由于某种原因关闭了连接。

答案 2 :(得分:0)

不要手工做这些事。使用HttpURLConnection,这就是它的用途。创建一个URL,从中获取HttpURLConnection,将请求方法设置为“PUT”,设置内容类型,设置内容长度,获取输出流,然后开始编写。