A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

今天我这里给大家分享一个文件上传的案例,里面用到的主要是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();
   }
  }
}
}
注:其实代码挺短的,但是用到的知识点比较多,大家如果有什么意见可以随时交流

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马