有问题的代码流程: ServerSocket serverSocket = new ServerSocket(8000);

Socket socket = serverSocket.accept(); InputStream is = socket.getInputStream();
//接收输入流操作
is.close();

OutputStream os = socket.getOutputStream();
//输出返回值os.write();
os.close();

socket.close();
没问题的流程: ServerSocket serverSocket = new ServerSocket(8000);

Socket socket = serverSocket.accept(); InputStream is = socket.getInputStream();
//接收输入流操作


OutputStream os = socket.getOutputStream();
//输出返回值os.write(); is.close();
os.close();
socket.close();
就这样的看,我真看不出个所以然,但是确实前者能完成返回消息,后者可以返回,求明白!socket getInputStreamgetOutputStreamclose

解决方案 »

  1.   

    单单看你这俩例子,应该没啥问题啊?是不是还有客户端Socket没贴上来,客户端的问题?
      

  2.   


    客户端同理:这个块和第一个块对应的,是开始使用的一对,然后出问题。Socket socket=new Socket(地址,端口)OutputStream os = socket.getOutputStream();
    //输出返回值os.write();
    os.close();InputStream is = socket.getInputStream();
    //接收输入流操作
    is.close();socket.close();
    然后改用现在这个,正常:Socket socket=new Socket(地址,端口)OutputStream os = socket.getOutputStream();
    //输出返回值os.write();
     
    InputStream is = socket.getInputStream();
    //接收输入流操作
     
    is.close();
    os.close();
    socket.close();自己感觉似乎输入输出流以关闭一个,然后socket就不正常工作了,进入源码看了下,但是没看出个所以然关系,所以求理解开始写时候很简单考虑服务端ServerSocket不关,accept阻塞到,一直有消息了,socket开始处理客户端先输出一句,所以服务端就接一句,所以服务先输入流,接完因为只要返回客户端一句,这个段就结束了,所以觉得接收完输入流就可以关闭了,然后给输出流,然后关闭,然后socket关闭。对应的客户端就是先开输出流,发完关闭,然后接对应的输入流,接完关闭,然后关闭socket但是实践到这样干不行不明白为什么。
      

  3.   

    没有深入学习过socket,看了下其构造方法,还是有绑定什么的,流、socket作为一个整体,从而客户端Socket与服务端Socket之间有影响。服务端或客户端对流进行关闭操作,不会影响自己对另外一个流的取操作,却会影响另外一段(客户端或服务端)对流进行取操作。这些流确实挺烦的,有此可见,放到finally里统一关闭,是多么的重要,呵呵。
      

  4.   

    ServerSocket serverSocket = new ServerSocket(8000);
     
    Socket socket = serverSocket.accept();
     
    InputStream is = socket.getInputStream();
    is.close();
    System.out.println(socket.isClosed());
    其实你关闭stream的时候,socket也关闭了。
    This class implements server sockets. A server socket waits for requests to come in over the network. It performs some operation based on that request, and then possibly returns a result to the requester.
    大概设计者的意思是说,这是个全双工的通讯,Server端的职责是响应请求,所以一个流关闭,则socket也没办法工作了
      

  5.   


    谢谢,全双工的通讯 一句足矣,自己能力不足无法看明白socket,但有这句加上以前网络方面的基础,理解了!