关于socket.socket.shutdownOutput()方法

程序一;

客户端

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();程序将不能运行

我不是很明白,请问有谁知道这是为什么吗?


sunny飒枫
浏览 11103回答 1
1回答

摩诃迦叶

这个问题问的好,其实这是因为在Server阻塞了。首先你要了解这两个方法是做什么用的。调用Socket.shutdownInput( )后, 禁用此套接字的输入流,发送到套接字的输入流端的任何数据都将被确认然后被静默丢弃。任何想从该套接字的输入流读取数据的操作都将返回-1;   调用Socket.shutdownOutput()后,禁用此套接字的输出流,对于 TCP 套接字,任何以前写入的数据都将被发送,并且后跟 TCP 的正常连接终止序列(即-1),之后,从另一端TCP套接字的输入流中读取数据时,如果到达输入流末尾而不再有数据可用,则返回 -1。就是说你没有调用shutdownOutput时,相当于没有跟服务器说“我已经说完啦,你可以说了”。那么服务器呢就觉得“哦,客户端还没说完,我要等它说完,要有礼貌”然后服务器就一直等,就阻塞了。他就不会给客户端发送消息“welcome”。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java