程序一;客戶端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條
添加回答
舉報
0/150
提交
取消