程序一;客户端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”。
添加回答
举报
0/150
提交
取消