1 回答

TA貢獻(xiàn)1776條經(jīng)驗(yàn) 獲得超12個(gè)贊
不評(píng)論代碼的其他問(wèn)題,僅回答為什么你的代碼看上去像是死循環(huán):因?yàn)榉?wù)端一直再接收客戶端傳送來(lái)的數(shù)據(jù),一直讀到-1個(gè)字節(jié)(或者說(shuō)EOF)才會(huì)跳出那個(gè)while循環(huán),但是除非你close客戶端的socket.close(), 服務(wù)端是不會(huì)收到EOF的,所以你的服務(wù)端代碼一直在等待客戶端傳數(shù)據(jù)過(guò)來(lái)。否則不會(huì)發(fā)送傳輸完畢的回答。
與此同時(shí),因?yàn)榉?wù)端代碼不發(fā)送傳輸完畢的回答,客戶端也在苦等服務(wù)端的響應(yīng),直到雙方某一方超時(shí)(你沒(méi)設(shè)置任何一端超時(shí))。
改進(jìn)方案:
我認(rèn)為你這是希望通過(guò)這一個(gè)socket做雙向通信,因此你需要設(shè)置一套自己的協(xié)議,比如先發(fā)4個(gè)字節(jié)過(guò)去,告訴服務(wù)端我這個(gè)文件的長(zhǎng)度是多少,接下來(lái)服務(wù)端接收了這么多字節(jié)就表示文件接收完畢,返回響應(yīng)消息。
除非你是想學(xué)習(xí)socket通信,否則為了實(shí)現(xiàn)文件傳輸,建議使用成熟的協(xié)議和方案,比如ftp或者h(yuǎn)ttp之類的。
另外我很好奇 Socket socket = new Socket(InetAddress.getLocalHost(), 10000); 我怎么把服務(wù)端關(guān)閉了,它仍然可以連接成功?不拋connection refuse異常。。。
添加回答
舉報(bào)