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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 潘东升 中级黑马   /  2012-5-27 17:56  /  1930 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

客户端实现键盘录入文件名上传文件,服务端实现接收文件并回馈消息给客户端
看代码,看结果:

class  Client2
{
public static void main(String[] args) throws Exception
{
//1、创建Socket服务,指定服务端地址和访问端口
  Socket sk = new Socket("127.0.0.1",9999);
//键盘录入文件名字,读取判断
  System.out.println("请输入文件名:");
  BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
  
  String name = br.readLine();
  File file = new File(name);
//判断是否传入正确文件名  
//--isFile()当且仅当此抽象路径名表示的文件存在且 是一个标准文件时,返回 true;否则返回 false
  while(!(file.isFile()))
  {
    System.out.println("请正确输入文件名:");
    name = br.readLine();
    file = new File(name);
  }
  
//判断文件是否存在,通过上面认识到exists不用判断了
//  if(!file.exists())
//   throw new RuntimeException("该文件不存在,请输入正确的文件名");
//因为文件可以是非文本文件  
  BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
//获取Socket服务的输出流
  ObjectOutputStream bos = new ObjectOutputStream(sk.getOutputStream());
//需要先把文件名发送给服务端,以便让服务端创建同名文件
  bos.writeObject(file);
  byte[] buf = new byte[1024];
  int len;
  while ((len=bis.read(buf))!=-1)
  {
   bos.write(buf,0,len);
  }
  bis.close();
  sk.shutdownOutput();

  InputStream ins = sk.getInputStream();
  byte[] bufin = new byte[1024];
  int lens;
  lens = ins.read(bufin);
  System.out.println(new String(bufin,0,lens));
  sk.close();
}
}
//郁闷了,其他文件都能上传,唯独txt格式的上传了,在服务端只创建了同名文件,而内容为空---------???
class ServerCode2 implements Runnable
{
private Socket sk;
public ServerCode2(Socket sk)
{
  this.sk = sk;
}
public void run()
{
  try
  {
//一般先把IP 和 port取出
   String ip = sk.getInetAddress().getHostAddress();
   int port = sk.getPort();
   System.out.println(ip+"--"+port+"..is connected.");
//获取socket服务的读取流,先用它来获取文件名,那就可以用字符读取流的缓冲区
   ObjectInputStream objin = new ObjectInputStream(sk.getInputStream());
//对象流,获取读取出来的对象是Object类型,需要向下转型
   File clientFile = (File)objin.readObject();
   String name = clientFile.getName();
   File dir = new File("c:\\");
   File file = new File(dir, name);
//判断是否存在,如果已存在,则在文件名后面加上数字用来区别和避免覆盖
   int count = 1;
   while(file.exists())
   {
    name = clientFile.getName();
    int index = name.lastIndexOf(".");
    name = name.substring(0,index)+"("+(count++)+")"+name.substring(index);
    file = new File(dir,name);
   }   
   FileOutputStream fos = new FileOutputStream(file);
   byte[] buf = new byte[1024];
   int len = 0;
   while ((len = objin.read(buf))!=-1)
   {
    fos.write(buf,0,len);
   }
//读取完成后该反馈信息给客户端,把信息写入Socket的输出流
   
   OutputStream  outs = sk.getOutputStream();
   byte[] bufout = "上传成功".getBytes();
   outs.write(bufout,0,bufout.length);
  
   fos.close();
   sk.close();
  }
  catch (Exception e)
  {
   throw new RuntimeException("接收上传文件失败");
  }
}
  
}
class Server2
{
public static void main(String[] arg) throws Exception
{
//创建服务端点,指定一个监听的端口
  ServerSocket ss = new ServerSocket(9999);
//服务器原理:把处理客户端访问的共用代码封装到实现Runnable接口的run方法中,
//可以通过创建多线程实现多线程并发处理,也就是客户端并发访问。
  while (true)
  {
   Socket sk = ss.accept();
   new Thread(new ServerCode(sk)).start();
  }
}
}


结果就是这样,只要是txt的上传完成都只是在服务端创建同名文件,但是内容是空的,其他格式的都没有问题,帮忙看看

评分

参与人数 1技术分 +1 收起 理由
攻城狮 + 1 赞一个!

查看全部评分

2 个回复

正序浏览
ttkl123654 发表于 2012-5-27 21:15

哈哈,还真是啊,
是不是除了使用字节流的单个字节读写方法不用涮缓冲,其他都要刷?
回复 使用道具 举报
看过,心有余而力不足,不好意思!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马