1 回答

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異常。。。
添加回答
舉報