上传任意文件到 服务器

文件名及类型 客户端传送

文件数据  客户端传送

多客户 同时 向服务端 上传文件 

服务端

这个服务端 有个局限性。当A客户端连接上以后。被服务器获取到,服务端执行具体流程

这时B客户端连接,只有等待

因为服务端还没有处理完A客户端的请求,还没有循环回来执行下一次accept方法。

所以获取不到B客户端对象

那么为了可以让多个客户端同时访问服务端

那么服务端最好就是将每个客户端都封装到一个单独的线程中,这样,就可以同时处理多个客户端请求

import java.net.*;
import java.io.*;
class sendFs 
{
	public static void main(String[] args)
	{
		try
		{
			Socket s = new Socket("127.0.0.1",13000);
			//读取 文件(字符?字节?)
			File f = new File("D:\\黑-马-程-序-员-面-试-技-巧.doc");//
			//如果不是一个文件的话  报错
			if(!f.isFile())
			{
				System.out.println("抱歉,这不是标准文件无法上传");
				return;
			}
				
			//传送流
			OutputStream out = s.getOutputStream();
			//获取文件名  发送文件名
			String name = f.getName();
			System.out.println(name);
			int dex = name.lastIndexOf(".");
			String na = name.substring(dex);
			System.out.println(na);
			out.write(name.getBytes());

			FileInputStream is = new FileInputStream(f);
			
			//读取本地文件
			byte[] buf = new byte[1024];
			int len = 0;
			while ((len=is.read(buf))!=-1)
			{
				out.write(buf,0,len);//文件数据写入输出流 通过网络传送
			}
			s.shutdownOutput();//告诉服务端 文件读取完毕 让服务端的的读取方法返回-1或null结束循环
			//接收客户端的反馈
			InputStream in = s.getInputStream();
			byte[]bf = new byte[1024];
			int le = in.read(bf);
			System.out.println(new String(bf,0,le));
			//关闭资源
			s.close();
			is.close();
		}
		catch (Exception e)
		{
			throw new RuntimeException("发送出错");
		}
	}
}
//由于要连接 多客户端 所以 服务端需要一直开启 等待接收连接
//一个客户端连接到服务端 服务端则获取一个客户端对象 只能响应一个客户端
//之后才连接另一个客户端  那么客户端必须一个一个访问服务端
//需要 同时服务多个客户端那么 就需要开启多线程
//连入一个客户端 则开启一个线程 创建一个客户端对象
class receFs implements Runnable
{
	Socket s;
	receFs(Socket s)
	{
		this.s = s;
	}
	public void run()
	{
		try
		{
			InputStream in = s.getInputStream();
			//复制的文件存放
			String IP = s.getInetAddress().getHostAddress();
			System.out.println(IP+",,,连接成功");
			String name = null;
			int count = 1;
			if(count == 1)
				{
					byte[]bf = new byte[1024];
					int le = in.read(bf);
					name=new String(bf,0,le);
				}
			int dex = name.lastIndexOf(".");
			String na = name.substring(dex);
			name = name.substring(0,dex);
			System.out.println(name);
			System.out.println(na);
			File f = new File("F:\\0123",name+"(上传)"+na);
			while(f.exists())
				f = new File("F:\\0123",name+"(上传)("+(count++)+")"+na);

			//将数据写入到文件中
			FileOutputStream os = new FileOutputStream(f);
			//获取数据
		
			byte[]buf = new byte[1024];
			int len = 0;
			while ((len=in.read(buf))!=-1)
			{
				os.write(buf,0,len);
				//os.flush();  可以不用刷新到文件  os流关闭的时候会刷入文件
			}
			OutputStream out = s.getOutputStream();
			out.write((f.getName()+"上传完成").getBytes());
			//关闭资源
			os.close();
			s.close();
		}
		catch (Exception e)
		{
			throw new RuntimeException("接收出错");
		}	
	}


	public static void main(String[] args) 
	{
		try
		{
			ServerSocket ss = new ServerSocket(13000);
			while (true)
			{
				Socket s = ss.accept();//阻塞方法
				new Thread(new receFs(s)).start();
			}
		}
		catch (Exception e)
		{
			throw new RuntimeException("服务器连接失败");
		}
		
	}
}