我正在尝试向客户端发送文件(作为字节数组发送的图像),然后服务器应该接收所述字节数组以进一步使用它。然而,当我点击“发送”发送图像时,文件传输开始(因为我在桌面上得到了sentImage.jpg),但由于某些原因我无法弄清楚并且图像永远不会被正确发送。
这是从服务器接收的部分(它已经接受了连接):
public void run(){
try {
byte[] receivedData = new byte[1024];
BufferedInputStream bis = new BufferedInputStream(client.getInputStream());
// while(bis.read() != -1){
s.acquireUninterruptibly();
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("C:\\Users\\Admin\\Desktop\\sentImage.jpg"));
while ((incoming = bis.read(receivedData)) != -1) {
bos.write(receivedData, 0, incoming);
}
s.release();
n.release();
bis.close();
bos.flush();
// }
} catch (IOException e) {
e.printStackTrace();
}
}
并且客户端正在这里发送:
public void sendImageResult() {
new Thread(new Runnable() {
public void run() {
try {
int inside = 0;
Socket socket = new Socket("localhost", 4444);
File myImageFile = new File("C:\\Users\\Admin\\Desktop\\test.jpg");
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(myImageFile));
BufferedOutputStream bos = new BufferedOutputStream(socket.getOutputStream( ));
byte[] byteArray = new byte[1024];
while ((inside = bis.read(byteArray)) != -1){
bos.write(byteArray,0,inside);
}
bis.close();
bos.flush();
} catch (UnknownHostException ex) {
System.out.println("No se pudo establecer la conexión.");
ex.printStackTrace();
} catch (FileNotFoundException fnf){
fnf.printStackTrace();
} catch(IOException ioe){
ioe.printStackTrace();
}
}
}).start();
}
答案 0 :(得分:0)
似乎没有用于写入磁盘的OutputStream(bos)被关闭。这可能会导致意想不到的结果。
答案 1 :(得分:0)
正如jt所说,写入磁盘的OutputStream没有被关闭,但是用于发送数据的OutputStream也没有被关闭,Socket也没有从发送端关闭。发送方可以在tcp级别缓冲数据,在发送最后一个数据包之前等待更多字节。你正在调用flush,但是可以忽略它,它不能保证像你期望的那样工作。另一件事是在Socket上调用shutdownOutput并查看是否强制它进行刷新。打开Socket时,也可以尝试setTcpNoDelay(true)。如果这些都不起作用,请获取tcp跟踪程序(我喜欢tcpdump)并使用它来查看数据包是否实际被发送,它至少会将其缩小到发送或接收端。