为了账号安全,请及时绑定邮箱和手机立即绑定

关于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 关注
  • 11118 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信