亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

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

關于socket.socket.shutdownOutput()方法

關于socket.socket.shutdownOutput()方法

sunny颯楓 2016-08-13 18:59:08
程序一;客戶端public class client2 { public static void main(String argv[]) throws UnknownHostException, IOException{ String str[]={"4","5","6"}; Socket socket=new Socket("localhost",8080); DataInputStream input=new DataInputStream(socket.getInputStream()); DataOutputStream output=new DataOutputStream(socket.getOutputStream()); for(String str1:str){ output.writeUTF(str1); String yourStr=input.readUTF(); System.out.println(yourStr); } socket.close(); }}服務器端public class Server2 { @SuppressWarnings("Deprecated") public static void main(String argv[]) throws UnknownHostException, IOException{ String str[]={"1","2","3"}; ServerSocket server=new ServerSocket(8080); Socket socket=server.accept(); System.out.println("succeed"); DataInputStream input=new DataInputStream(socket.getInputStream()); DataOutputStream output=new DataOutputStream(socket.getOutputStream()); for(String str1:str){ String yourStr=input.readUTF(); System.out.println(yourStr); output.writeUTF(str1); } socket.close(); server.close(); }}這里并沒有使用socket.shutdownOutput();程序正常運行程序二服務器端;public class Server { public static void main(String argv[]) throws IOException{ ServerSocket serverSocket=new ServerSocket(8888); System.out.println("succeed,wait client connects"); Socket socket=serverSocket.accept(); InputStream is=socket.getInputStream(); InputStreamReader isr=new InputStreamReader(is); BufferedReader reader=new BufferedReader(isr); String info=null; while((info=reader.readLine())!=null){ System.out.println("我是服務器,客戶端說"+info);} socket.shutdownInput(); OutputStream out=socket.getOutputStream(); PrintWriter writer=new PrintWriter(out); writer.write("welcome!"); writer.flush(); socket.close(); serverSocket.close(); }}客戶端;public class Client { public static void main(String[]argv) throws UnknownHostException, IOException{ Socket socket=new Socket("localhost",8888); OutputStream stream=socket.getOutputStream(); PrintWriter writer=new PrintWriter(stream); writer.println("用戶名:我;密碼:19"); writer.flush();// 此處 socket.shutdownOutput(); InputStream st=socket.getInputStream(); InputStreamReader read=new InputStreamReader(st); BufferedReader bu=new BufferedReader(read); String info=null; while((info=bu.readLine())!=null){ System.out.println(info); } socket.close(); }}這里如果去掉客戶端的?socket.shutdownOutput();程序將不能運行我不是很明白,請問有誰知道這是為什么嗎?
查看完整描述

1 回答

已采納
?
摩訶迦葉

TA貢獻146條經驗 獲得超54個贊

這個問題問的好,其實這是因為在Server阻塞了。

首先你要了解這兩個方法是做什么用的。

調用Socket.shutdownInput( )后, 禁用此套接字的輸入流,發送到套接字的輸入流端的任何數據都將被確認然后被靜默丟棄。任何想從該套接字的輸入流讀取數據的操作都將返回-1;

?? 調用Socket.shutdownOutput()后,禁用此套接字的輸出流,對于 TCP 套接字,任何以前寫入的數據都將被發送,并且后跟 TCP 的正常連接終止序列(即-1),之后,從另一端TCP套接字的輸入流中讀取數據時,如果到達輸入流末尾而不再有數據可用,則返回 -1。

就是說你沒有調用shutdownOutput時,相當于沒有跟服務器說“我已經說完啦,你可以說了”。那么服務器呢就覺得“哦,客戶端還沒說完,我要等它說完,要有禮貌”然后服務器就一直等,就阻塞了。他就不會給客戶端發送消息“welcome”。


查看完整回答
4 反對 回復 2016-08-13
  • sunny颯楓
    sunny颯楓
    嗯,謝謝,我明白兩個方法的作用了。 可是我還有兩個疑問 1。就是為什么我的第一個程序沒有這個方法,還是能運行呢? 2。禁用套接字的流,意思就是后面不能輸入、輸出了嗎?那么有方法可以重新打開這個流嗎?
  • 摩訶迦葉
    摩訶迦葉
    while((info=reader.readLine())!=null){ System.out.println("我是服務器,客戶端說"+info);} 在這里,客戶端做了一次寫操作,服務器做了一次讀操作,然后輸出一次信息。 然后循環一次,服務器做第二次讀操作,結果客戶端沒去寫,它讀不到了,有沒有Socket.shutdownInput( ),他就一直等客戶端進行寫操作,就阻塞了。 for(String str1:str){ String yourStr=input.readUTF(); System.out.println(yourStr); output.writeUTF(str1); } 而在這里,客戶端進行了3次寫操作,服務器讀了3次,都滿足了。 也沒讓服務器去讀第四次,當然就不會阻塞了。
  • 摩訶迦葉
    摩訶迦葉
    禁用此套接字的輸入流,還可以輸出。禁用此套接字的輸出流,還可以輸入。 對一個socket關閉就不能重新打開了
點擊展開后面4
  • 1 回答
  • 1 關注
  • 11193 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號