您的位置:首页 > 理论基础 > 计算机网络

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

2012-07-18 11:53 281 查看
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,可以结束掉
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: