今天我这里给大家分享一个文件上传的案例,里面用到的主要是TCP协议,IO流和多线程:
首先我们定义客户端:
package cn.com.TCPSocket;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;
public class FileUpClient {
public static void main(String[] args) throws IOException, IOException {
//这是本人的IP地址,并定义一个端口
Socket s=new Socket("192.168.27.70",10086);
//在项目中自己创建一个sjw.txt的文件,也就是我们将要上传的文件
BufferedReader br=new BufferedReader(new FileReader("sjw.txt"));
//这里定义一个高效的字符输出流,目的就是为了将读取到的文件写入到服务器端
BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
//读取文件内容
String line=null;
while((line=br.readLine())!=null){
bw.write(line);
}
//读取完成后,告诉服务器端,我们已经写完了,请求它的提示(通俗说法)
s.shutdownOutput();
//定义一个高效字符输入流,准备读取服务器端发过来的提示信息
BufferedReader brClient = new BufferedReader(new InputStreamReader(s.getInputStream()));
//读取服务器端的反馈信息
String result = brClient.readLine();
System.out.println("反馈信息:" + result);
//记得关闭socket,IO流是不需要关闭的,因为它们都是在socket的基础上创建的,socket一关闭,io流自动关闭
s.close();
}
}
然后进行服务端配置:
package cn.com.TCPSocket;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class FileUpServer {
public static void main(String[] args) throws IOException {
//建立服务端的ServerScoket准备接受客户端的Socket
ServerSocket ss=new ServerSocket(10086);
Object obj=new Object();
//由于客户端一直会有信息传过来,所以这里我们用循环
while(true){
//随时准备接受客户端传过来的socket,和服务器端建立连接
final Socket s=ss.accept();
//为了防止多个客户端端socket同时进入,这里定义同步方法
synchronized(obj){
//每次进来一个客户端socket,服务器就多出一个线程与其交流
new Thread(){
public void run(){
try{
BufferedReader br=new BufferedReader(new InputStreamReader(s.getInputStream()));
//这里获取到系统当前时间的毫秒数,是为了避免服务器端出现同名的文件
long time=System.currentTimeMillis();
//将客户端传过来的文件写入到一个新命名的文件中(通过毫秒时间确定文件名不会重复)
BufferedWriter bw=new BufferedWriter(new FileWriter(time+".txt"));
//读取客户端传过来的文件内容
String line=null;
while((line=br.readLine())!=null){
bw.write(line);
}
//socket中,对于指向文件的io流必须进行关闭,这点需要注意
bw.close();
//服务器读取文件完成后给客户端准备返回一个提示信息
PrintWriter pw = new PrintWriter(s.getOutputStream(), true);
//告诉客户文件上传成功
pw.println("文件上传成功");
s.close();
}catch(Exception e){
e.printStackTrace();
}
}
}.start();
}
}
}
}
注:其实代码挺短的,但是用到的知识点比较多,大家如果有什么意见可以随时交流
|
|