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,可以结束掉