网络编程_TCP协议的文件上传

 1、需求分析:

                          ①客户端向服务端上传一个文本文件

                          ②服务端收到文件后,反馈一个结束信息,并打印"接收数据成功"

                          ③客户端收到服务端的反馈后,打印"上传文件成功"


                   2、客户端:

                           ①定义Socket、文件输入流、Socket输出流、Socket输入流

                          ②从文件输入流读取文件, 

                        ③将读到的数据写入Socket输出流中

                         ④关闭资源

                 详细的看代码注释;

package day23.fileUpload;
import java.net.*;
import java.io.*;
/**
 * @author Administrator @zsw 2012-7-18 上午09:21:04
 * 
 * 需求:从客户端上传文本文件到服务端
 * 
 * 客户端上传:
 * ①定义Socket、文件输入流、Socket输出流、Socket输入流
 * ②从文件输入读取文件,
 * ③将读到的数据写入Socket输出流中
 * ④关闭资源
 */
public class FileClient {

	
	public static void main(String[] args) throws Exception{
		//①:定义资源
		Socket s=new Socket("127.0.0.1",10006);
		BufferedReader bufr=new BufferedReader(new FileReader("D:\\1.txt"));
		//字符流转换成字节流
		BufferedWriter bufout=new BufferedWriter(
				new OutputStreamWriter(s.getOutputStream()));
//		PrintWriter out=new PrintWriter(s.getOutputStream(),true);
		BufferedReader bufin=new BufferedReader(
				new InputStreamReader(s.getInputStream()));
		
	
		//②上传数据
		String line=null;
		while((line=bufr.readLine())!=null){
			 
			System.out.println(line);
			bufout.write(line);
			bufout.newLine();
			bufout.flush();
		}
		
		//③告诉服务器,客户端已经传完了。并接收服务端的反馈信息
		 s.shutdownOutput();//关闭客户端的输出流,相当于在流中写-1
		 
		 String line2=null;
		 while((line2=bufin.readLine())!=null){
			 if("success".equals(line2)){	
				 System.out.println("上传文件成功!");
				 break;
			 }
		 }
		
		//④关闭资源
		 bufr.close();
		 s.close();


	}

}

    3、服务端: 

                  ①、定义资源:ServerSocket、流 

                      ②接收客户端的数据,并将数据写入文件

                    ③接收完后,给客户端反馈"success" 

                  ④关闭资源

        详细的见代码注释:

   

package day23.fileUpload;
import java.io.*;
import java.net.*;
/**
 * @author Administrator @zsw 2012-7-18 上午09:43:46
 * 
 * 服务端:
 * 1、定义资源:ServerSocket、流
 * 2、接收客户端的数据,并将其写入文件
 * 3、接收完后,给客户端反馈"success"
 * 4、关闭资源
 * 
 * 总结:
 * ①使用了readLine这样的阻塞方法,由于它读数据丢弃了换行的数据
 *   所有在写到流中的时候要添加换行数据
 * ②整个流写完了,要做一个结束标记,这样结束端就可以结束
 *   使用s.shutdownOutput() ,即调用Socket的shutdownOutput方法
 *   往流里面添加一个-1,是readLine()=null,可以结束掉
 */
public class FileServer {
	
	public static void main(String[] args) throws Exception {
		//①资源
		ServerSocket ss=new ServerSocket(10006);
		Socket s=ss.accept();
		//文件输出流
		BufferedWriter bufw=new BufferedWriter(new FileWriter("D:\\tx\\1.txt"));
		//Socket 输出输入
		BufferedReader bufin=new BufferedReader(
				new InputStreamReader(s.getInputStream()));
		BufferedWriter bufout=new BufferedWriter(
				new OutputStreamWriter(s.getOutputStream()));
	
		String ip=s.getLocalAddress().getHostAddress();
		System.out.println(ip+" ....connnect ");
		//②:读数据、写到文件、判断结束、反馈成功
		String line=null;
		/*
		 * 服务端收不到line=null的情况,必须在流中添加结束标记
		 *  s.shutdownOutput();
		 *  关闭客户端的输出流,相当于在流中写-1,line就可以=null
		 */
		//获取标记符(即时间值) 
		while((line=bufin.readLine())!=null){
			bufw.write(line);
			bufw.newLine();
			bufw.flush();
				
		}
		System.out.println("数据接收成功!");
		bufout.write("success");
		bufout.newLine();
		bufout.flush();
		s.shutdownOutput();
		
		//不必资源
		bufw.close();
    	s.close();
		ss.close();
		
		
		
	}

}

 

   4、问题总结

         ①使用了readLine这样的阻塞方法,由于它读数据丢弃了换行,所以在写到流中的时候要添加换行数据,否则会一直等待。

         ②整个流写完了,要做一个结束标记,这样结束端就可以结束,

            使用s.shutdownOutput() ,即调用Socket的shutdownOutput方法往流里面添加一个-1,使readLine()=null,可以结束掉


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值