2011-08-12 22 views
0

我从一个套接字发送文件到另一个套接字。在此之后,我尝试发送一条简单消息,但这不起作用。有人可以说明原因吗?Java Socket信息在文件传输后不可读

发送的文件和消息:

byte[] buffer = new byte[16384]; 
InputStream inputStream = new FileInputStream(f); 
OutputStream outputStream = client.getOutputStream(); 
int len = 0; 
while ((len = inputStream.read(buffer)) > 0) { 
    outputStream.write(buffer, 0, len); 
} 
client.shutdownOutput(); 

//Following doesnt work: 
PrintWriter m_out = new PrintWriter(outputStream); 
m_out.println("anfrage erhalten"); 
m_out.flush(); 

接收文件和消息:

File pdfFile = new File("marke.pdf"); 
OutputStream fs = new FileOutputStream(pdfFile); 

OutputStream os = client.getOutputStream(); 
InputStream is = client.getInputStream(); 

byte[] buffer = new byte[16384]; 
int len = 0; 
while ((len = is.read(buffer)) != -1) { 
    fs.write(buffer, 0, len); 
} 
fs.flush(); 
fs.close(); 
client.shutdownOutput(); 

// Here i will receive the Message after the file transfer, but this doesnt work! 
System.out.println(br.readLine()); 
+0

什么都不起作用,例外?我猜你关闭了'clinet.shutdownOutput()'中的客户端套接字,但它只是一个猜测... – home

+0

here:System.out.println(br.readLine()); 我应该收到消息“Anfrage erhalten”。但只有NULL和没有数据。没有关机是一样的,这只是一个从任何地方解决我的问题tipp,但它不起作用。如果我发送信息befor我传输文件,它的工作原理。 – Fabix123

回答

2

你写了一个消息已经玩具关闭输出后的输出流。通过这样做你应该得到一个IOException。

此外,您在写入一些二进制数据后使用相同的流写入文本数据。如果你这样做,你必须在另一端找到一种方法来知道二进制数据的结束位置以及文本数据何时开始。如果你像读取字节一样读取字节,那么你将读取与文本数据字节连接的二进制数据。

+0

嘿,谢谢你,但我怎么知道二进制数据结束? – Fabix123

+0

您需要定义一个专用协议。一种方法是编写二进制数据的长度,然后是二进制数据,然后是文本数据。读取时,首先读取长度(n),然后读取二进制数据(n个字节),然后读取文本数据。 DataOutputStream和DataInputStream可能会有所帮助。 –

+0

谢谢你,你知道一个网站或什么地方,我可以找到这些事情的例子或教程? – Fabix123