Java 服务器多线程处理文件上传

import java.io.*;  
import java.net.*;  
  
class UploadThread implements Runnable  //将上传封装到线程里  
{  
    private Socket client;  
    public UploadThread(Socket s)  
    {  
        this.client=s;  
    }  
    public void run()  
    {  
        String ip = client.getInetAddress().getHostAddress(); //得到 IP地址  
        try {  
            BufferedInputStream sin = new BufferedInputStream(client.getInputStream()); //Socket 读取流  
            File file  = new File ("C:\\1.jpg");  
            BufferedOutputStream fout = new BufferedOutputStream(new FileOutputStream(file)); // 文件输出流  
            byte buf[] = new byte[1024];  
            int len  = 0;  
            System.out.println(ip+"...connecting...");  
            //开始从网络中读取数据  
            while((len = sin.read(buf))!=-1)  
            {  
                fout.write(buf,0,len);  
            }  
            //BufferedOutputStream sout = new BufferedOutputStream(client.getOutputStream());  
            PrintStream sout = new PrintStream(client.getOutputStream());  
            sout.write("发送成功".getBytes());  
            //sout.flush();                 //虽然是字节流,但其用的是BufferedOutputStream  
            fout.close();  
            sin.close();  
            sout.close();  
        }catch(Exception ex)  
        {  
            System.out.println("上传文件失败");  
              
        }  
  
          
    }  
}  
  
  
  
  
public class Server {  
      
    public static void main(String args[]) throws Exception   
    {  
        ServerSocket server = new ServerSocket(2222);  
        while(true)  
        {  
            Socket client = server.accept();  
            new Thread(new UploadThread(client)).start();  
        }  
          
    }  
}  
  
/* 
 *    服务器处理多线程问题 
 *           
 *  1.因为服务器是要很多人访问的,因此里面一定要用多线程来处理,不然只能一个人一个人的访问,那还叫Y啥服务器 
 *  
 *  2,拿上面这个文件上传的例子来说,它将每个连接它的用户封装到线程里面去,把用户要执行的操作定义到 run 方法里面 
 *     一个用户拿一个线程,拿到线程的就自己去执行,如果有其它用户来的时候,再给新来的用户分配一个新的线程 
 *     这样就完成了服务器处理多线程的问题 
 *  3. 在服务器与客户端互传数据时,我们要特别注意的是,防止两个程序造成 死等的状态,一般原因有以下: 
 *  
 *  1. 客户端向数据端发送数据时,当发送的是字符时,第次以一行来发送,而服务端在读取的时候,也是以 
 *      一行来读取,readLine() 而发送的时候往往只是发送换行以行的内容,而不能发换行也发送过去, 
 *     那么服务端在读取的时候就不读取不到换行 ,那么 readLine() 就不会停止 
 *  2. 客户端发送数据时,如果处理的是用  字符流     或是缓冲流的话,一定要记得刷新流,不然的话,数据就会发不出来 
 *  3. 在用IO 读取文件里面的数据然后发送到服务端 时,当家读取文件 while(in.read()) 读取文件结束时,而在 
 *     服务端的接收程序  while(sin.read())不会接到一个发送完毕的提示,所以会一直等待下去,所以我们在处理这 
 *     个问题的时候,还要将其发送一个文件读取结束的标志,告诉接收端文件已经读取完结,不要再等待了 
 *     而socket 里面给我们封装了 shutdownInput shutdownOutput 两个操作,此可以关闭 流,两样也可以起到告诉 
 *     接收方文件传送完毕的效果  
 *  
 *  
 *  
 * */  
  
import java.net.*;  
import java.io.*;  
public class Upload {  
  
    public static void main(String args[]) throws Exception  
    {  
        Socket client = new Socket("172.16.215.105",2222);  
        File file = new File("F:\\e.jpg");  
        BufferedInputStream fin = new BufferedInputStream(new FileInputStream(file)); //文件读取流  
        PrintStream sout = new PrintStream(client.getOutputStream(),true);   //得到socket 流  
        byte buf [] = new byte[1024];  
        int len =0;  
        while((len=fin.read(buf))!=-1)  
        {  
            sout.write(buf,0,len);  
            System.out.println(len+"...发送中");  
        }  
        client.shutdownOutput();  
        BufferedInputStream sin = new BufferedInputStream(client.getInputStream());  
        len = sin.read(buf);  
        System.out.println(len);  
        System.out.println(new String(buf,0,len));  
        sin.close();  
        sout.close();  
        fin.close();  
          
    }  
}  

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。