2012-07-10 66 views
1

我正在尝试编写一个非常简单的应用程序,该应用程序会通过HTTP将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] 

我在做什么错在这里?

回答

0

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

+0

由于上传要求,我_要设置内容长度。我能否像正常输出流一样写,这样我就可以测量上传进度了吗? – 2012-07-10 16:08:56

+0

@TKKocheran不,你不知道。 Java将自动设置内容长度。自己设置只会提供一个错误的机会。如果这是一个很大的转移,我会设置分块传输模式。是的,您可以监视输出流的进度。 – EJP 2012-07-11 00:56:41

0

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

您还应该修改您的write调用,以仅写入阵列的第一个bytesRead字节。

+0

固定并修复,仍然会损坏管道。 – 2012-07-10 02:07:03

+0

将你的输出分割成一个文件并检查它。我喜欢从apache公共版本中使用'TeeOutputStream'。确保你的ticket.getEndpoint()是正确的(例如没有'http:// host.com'前缀)。 – 2012-07-10 02:18:04

+0

'ticket.getEndpoint()'结果应该是什么样子?它应该是完全形成的网址还是网站根目录的相对网址? – 2012-07-10 16:12:28

0

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

+0

你的第一句话是正确的,但其余的不是。 'Socket.isConnected()'不会检测到。它不是连接状态,而是套接字状态。 – EJP 2012-07-10 02:26:01

+0

对..我会删除那部分。 – Soronthar 2012-07-10 14:33:29

相关问题