第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

這個程序問題在哪里?為什么好像陷入死循環(huán)?

這個程序問題在哪里?為什么好像陷入死循環(huán)?

尚方寶劍之說 2019-03-22 18:19:09
客戶端向服務(wù)發(fā)送數(shù)據(jù)。服務(wù)器收到數(shù)據(jù)后給客戶端反饋??墒浅绦蜻\行之后并沒有返回數(shù)據(jù)給客戶端,而且程序也沒有停下來。class TcoClient{    public static void main(String[] args) throws IOException {       BufferedInputStream bis = new BufferedInputStream(new FileInputStream("C:\\Users\\Administrator\\Desktop\\abs.apk"));       Socket socket = new Socket(InetAddress.getLocalHost(), 10000);       OutputStream os = socket.getOutputStream();       byte[] buf = new byte[1024];       int len;       while ((len = bis.read(buf)) != -1) {           os.write(buf, 0, len);       }       InputStream is = socket.getInputStream();       int backLen = is.read(buf);       System.out.println(new String(buf, 0, backLen));       os.close();   }}class TcpServer {   public static void main(String[] args) throws IOException {       ServerSocket serverSocket = new ServerSocket(10000);       Socket socket = serverSocket.accept();       InputStream is = socket.getInputStream();       BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("C:\\Users\\Administrator\\Desktop\\cde.apk"));       byte[] buf = new byte[1024*1024];       int len;       while ((len = is.read(buf)) != -1) {           bos.write(buf, 0, len);       }       OutputStream os = socket.getOutputStream();       os.write("文件傳輸完成".getBytes());   }
查看完整描述

1 回答

?
叮當(dāng)貓咪

TA貢獻1776條經(jīng)驗 獲得超12個贊

不評論代碼的其他問題,僅回答為什么你的代碼看上去像是死循環(huán):因為服務(wù)端一直再接收客戶端傳送來的數(shù)據(jù),一直讀到-1個字節(jié)(或者說EOF)才會跳出那個while循環(huán),但是除非你close客戶端的socket.close(), 服務(wù)端是不會收到EOF的,所以你的服務(wù)端代碼一直在等待客戶端傳數(shù)據(jù)過來。否則不會發(fā)送傳輸完畢的回答。

與此同時,因為服務(wù)端代碼不發(fā)送傳輸完畢的回答,客戶端也在苦等服務(wù)端的響應(yīng),直到雙方某一方超時(你沒設(shè)置任何一端超時)。

改進方案:
我認(rèn)為你這是希望通過這一個socket做雙向通信,因此你需要設(shè)置一套自己的協(xié)議,比如先發(fā)4個字節(jié)過去,告訴服務(wù)端我這個文件的長度是多少,接下來服務(wù)端接收了這么多字節(jié)就表示文件接收完畢,返回響應(yīng)消息。

除非你是想學(xué)習(xí)socket通信,否則為了實現(xiàn)文件傳輸,建議使用成熟的協(xié)議和方案,比如ftp或者http之類的。

另外我很好奇 Socket socket = new Socket(InetAddress.getLocalHost(), 10000); 我怎么把服務(wù)端關(guān)閉了,它仍然可以連接成功?不拋connection refuse異常。。。


查看完整回答
反對 回復(fù) 2019-04-16
  • 1 回答
  • 0 關(guān)注
  • 531 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號