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

标签 java http sockets

我正在尝试编写一个非常简单的应用程序,它将使用 PUT 请求通过 HTTP 将视频上传到我的一台服务器。我的代码如下所示:

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]

我在这里做错了什么?

最佳答案

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

关于java - 尝试写入文件时出现 Broken Pipe 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11405582/

相关文章:

java - 如何将值传递给菜单项单击时的旋转方法?

http - 使用 DELETE 方法的 Worklight WL.Server.invokeHttp() 不接受查询参数

c++ - 丢包只发生在第一次运行

java - 通过 Java UDP 网络发送 JPanel

在重新启动的 Tomcat 中刷新页面后,AJAX GET 请求出现在 URL 栏中

c++ - QT:无法从另一个线程启用套接字通知程序

java - App Engine - Java AppStats - 将所有请求显示为 cpu 时间 0

java - 使用 Java2D 绘制 3D 房屋?

java - 有没有一种方法可以在不使用 Netbeans、Eclipse 或场景生成器的情况下创建 FXML/Javafx 桌面应用程序?

http - HTTP 服务器应该如何处理 If-Unmodified-Since 在一秒钟内发生多次更改?