程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 編程解疑 >> java socket 傳文件-JAVA中在使用Socket從客戶端項服務端傳文件時,程序阻塞在獲取Socket套接字輸入流那一行是為什麼?

java socket 傳文件-JAVA中在使用Socket從客戶端項服務端傳文件時,程序阻塞在獲取Socket套接字輸入流那一行是為什麼?

編輯:編程解疑
JAVA中在使用Socket從客戶端項服務端傳文件時,程序阻塞在獲取Socket套接字輸入流那一行是為什麼?

這樣寫會阻塞在下面那一行,而調整位置後成功時什麼問題,在我的理解中這一行的聲明只要出現在使用之前就可以了。望解答,感謝

客戶端上傳文件程序

 Socket socket = new Socket("127.0.0.1", 8888);
        File file = new File("D:\\1610\\android素材\\bg04.jpg");
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
        ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
        **ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());**           //阻塞在這一行?我把這一行放在下面時該程序就運行成功,這之間有什麼關系嗎?希望大神解答,感謝!!!!
        System.out.println(file.getName());
        oos.writeUTF(file.getName());
        oos.writeLong(file.length());

        byte[] arr = new byte[1024];
        int len;
        while((len = bis.read(arr)) != -1){
            oos.write(arr,0,len);
            oos.flush();
        }
        //  上面那一行放在該位置
        System.out.println("1111");
        if(ois.readUTF().equals("下載成功")){
            System.out.println("文件上傳成功");
            ois.close();
            oos.close();
            bis.close();
            socket.close();
        }

服務端接受文件代碼塊

 ServerSocket serverSocket = new ServerSocket(8888);
        System.out.println("服務器已啟動...");
        while (true) {
            Socket socket = serverSocket.accept();
            ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
            //這個位置
            String fileName=ois.readUTF();
            long extent = ois.readLong();
            System.out.println(extent);
            File file = new File("D:/TestFile");
            if (file.isDirectory()) {
                System.out.println("文件夾已存在");
            } else {
                file.mkdirs();
            }
            BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(file.getAbsolutePath() +"/"+ fileName));
            BufferedWriter bw = new BufferedWriter(new FileWriter("down.log",true));
            _**ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());**_//或者是我把這一行放在上面位置也能成功
            byte[] arr = new byte[1024];
            int len;
            long total = 0;
            while ((len = ois.read(arr)) != -1) {
                bos.write(arr, 0, len);
                total += len;
                bw.write("當前已下載" + (total * 100) / extent + "%"
                        + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
                bw.newLine();
                bw.flush();
                if (total == extent) {
                    oos.writeUTF("下載成功");
                    break;
                }
            }
            System.out.println("下載成功");
            oos.close();
            bw.close();
            bos.close();
            ois.close();
            socket.close();
        }

最佳回答:


看jdk官方的文檔就知道答案了:
public ObjectInputStream(InputStream in)
throws IOException創建從指定 InputStream 讀取的 ObjectInputStream。從流讀取序列化頭部並予以驗證。在對應的 ObjectOutputStream 寫入並刷新頭部之前,此構造方法將阻塞。

                                這時候socket.getInputStream()還沒有數據流過來,所以就等待數據,阻塞了
u011606457
u011606457
CrazyCoding123
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved