A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 刘圣伟 中级黑马   /  2012-8-23 16:53  /  1511 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

package NET;

import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;

public class TextClient2 {

    /**
     * @param args
     */
    public static void main(String[] args) {
        Socket s= null;
        try {
            s = new Socket("127.0.0.1",10006);
        } catch (UnknownHostException e) {            
            e.printStackTrace();
        } catch (IOException e) {            
            e.printStackTrace();
        }
        BufferedReader bufr = null;
        PrintWriter out = null;
        
        try {
            bufr = new BufferedReader(
                    new FileReader("d:\\demo.txt"));
            out = new PrintWriter(s.getOutputStream(),true);
//            DataOutputStream dos = new DataOutputStream(s.getOutputStream());
            
            /*//定义时间标记
            long time = System.currentTimeMillis();
//            out.println(time);
            dos.writeLong(time);
            */
        } catch (FileNotFoundException e) {            
            e.printStackTrace();
        }catch (IOException e) {            
            e.printStackTrace();
        }
        String line = null;
        try {
            while((line=bufr.readLine())!=null){
                out.println(line);
            }
//        out.close();        这个地方为什么不能通过关闭这个socket的,输出流来结束文件的复制呢,s.shutdownOutput()不也是关闭操作码?

            s.shutdownOutput();//关闭客户端的输出流,相当于给流中加入一个结束标记。
//            out.println("over");
        } catch (IOException e) {            
            e.printStackTrace();
        }
        
        BufferedReader bufIn=null;
        String str=null;
        try {
            bufIn = new BufferedReader(new InputStreamReader(
                    s.getInputStream()));
            str = bufIn.readLine();
            System.out.println(str);
            
            bufr.close();
            s.close();
        } catch (IOException e) {            
            e.printStackTrace();
        }        

    }

}

1 个回复

倒序浏览
   out.close();  这个地方为什么不能通过关闭这个socket的,输出流来结束文件的复制呢,s.shutdownOutput()不也是关闭操作码?
其实这个说法不是很正确,soket只是用来建立发送数据的方式,而
流是真正用来运输数据的途径。当你 执行out.close()时,就相当于释放掉这个流所占用的所有资源,以后通过这个任何操作这个流的方法是不可能的。比如你后面的 out.println("over");这个肯定是执行不了的,会抛出IOException的。soket占用的资源其实就是IP和端口资源,利用这些资源我们可以进行TCP和UDP等网络传输。
你关闭了sokect,但是IO流不会受到影响。IO要是被关闭了,与之相关联的sokect服务也被中断了,但是这个关闭是不正常的关闭。显然你的程序的灵活性很低。。。这个和你关电脑,是直接拔掉电源还是通过软关机是一个道理。。。。        

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马