Java套接字:如何在发送文件后保持套接字“打开”?

时间:2017-03-08 14:37:04

标签: java sockets server client

首先请原谅我的节目,因为我不太善于解释事情。

所以,我所做的是创建了一个能够通过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我发送文件并停止图像“阅读”。如果它是一个菜鸟问题,请提前抱歉。

1 个答案:

答案 0 :(得分:0)

可能是因为您希望从套接字读取8192个字节,并且您尝试在文件中写入8192个字节,但可能是您从套接字中恢复的字节数少于8192,这可能会阻止文件,直到8192字节已写入文件

另外,我建议首先读取8192个字节,当你有缓冲区写入它时,因为你总是从偏移0写入:

while ((count = in.read(buffer)) > 0) {
                     out.write(buffer, 0, count);
                     out.flush();
                }