首先请原谅我的节目,因为我不太善于解释事情。
所以,我所做的是创建了一个能够通过LAN进行通信的简单聊天程序。我最近做了这个,所以我可以通过套接字发送文件
这是一个框架,其中有一个按钮,用于打开下面显示的文件选择器。
public void actionPerformed(ActionEvent arg0) {
JFileChooser chooser = new JFileChooser();
FileNameExtensionFilter filter = new FileNameExtensionFilter(
"Images", "jpg", "gif","png");
FileNameExtensionFilter filter2 = new FileNameExtensionFilter(
"Document", "docx", "doc","pdf","pptx");
chooser.setFileFilter(filter);
chooser.setFileFilter(filter2);
Component parent = null;
int returnVal = chooser.showOpenDialog(parent);
if(returnVal == JFileChooser.APPROVE_OPTION) {
File filesend = new File(chooser.getSelectedFile().getPath());
int count;
OutputStream out;
byte[] buffer = new byte[8192];
try {
c.setMessage("fsendnow");// Sends a command to the server so it knows that im sending a file so it can prepare to receive it
c.msgOut();
out = c.getMyClient().getOutputStream();
BufferedInputStream in = new BufferedInputStream(new FileInputStream(filesend));
while ((count = in.read(buffer)) > 0) {
out.write(buffer, 0, count);
out.flush();
}
}catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
这是接收文件的代码
}else if(line.equalsIgnoreCase("fsendnow")){
byte[] buffer = new byte[8192];
FileOutputStream fos = new FileOutputStream("a.png");
BufferedOutputStream out2 = new BufferedOutputStream(fos);
int count;
InputStream in = client.getInputStream();
while((count=in.read(buffer)) >=0){
fos.write(buffer, 0, count);
}
fos.close();
}else{
cf.printMsg(client.getInetAddress().getHostAddress()+": "+line);
}
我面临的问题是在我发送文件后,它确实出现在文件夹中,但是,我无法打开它,因为它“正在使用”。我的猜测是正在运行的程序仍在向它写入字节。由于这个套接字仍然“被使用”,我无法对程序做任何事情(发送消息/更多文件)。我尝试在这里关闭套接字,但我仍然需要它发送消息,直到我退出聊天窗口。我该怎么办?我应该打开一个新的套接字连接吗?我真的不想这样做,老实说,我不想创建一个线程服务器。
while ((count = in.read(buffer)) > 0) {
out.write(buffer, 0, count);
out.flush();
}
//c.getMyClient().close(); CLOSES THE SOCKET
}catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
所以我怎么告诉java我发送文件并停止图像“阅读”。如果它是一个菜鸟问题,请提前抱歉。
答案 0 :(得分:0)
可能是因为您希望从套接字读取8192个字节,并且您尝试在文件中写入8192个字节,但可能是您从套接字中恢复的字节数少于8192,这可能会阻止文件,直到8192字节已写入文件
另外,我建议首先读取8192个字节,当你有缓冲区写入它时,因为你总是从偏移0写入:
while ((count = in.read(buffer)) > 0) {
out.write(buffer, 0, count);
out.flush();
}