黑马程序员技术交流社区

标题: TCP文件复制上传。 [打印本页]

作者: 刘圣伟    时间: 2012-8-23 16:53
标题: TCP文件复制上传。
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();
        }        

    }

}

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






欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2