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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 创造命运 中级黑马   /  2014-4-20 18:53  /  892 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 创造命运 于 2014-4-21 08:12 编辑

/*下面程序是在看完毕老师的视频:第24天-01-网络编程(TCP-上传图片).avi后想到要写的。
本程序实现如下功能:1.由客户端向服务器端上传文件,文件类型可以是任何类型
                                2.服务器端获取所上传文件的文件名,并以此作为自己的文件名
                                3.如果在服务器本机的当前目录下已经存在了所上传的文件,则自动另外命名
拓展:多个客户端并发上传。暂时这里没实现该功能,后续完成。*/
import java.net.*;
import java.io.*;
import java.util.*;

//客户端
class TransClient
{
        public static void main(String[] args) throws Exception
        {
                Socket s = new Socket("192.168.113.1", 10006);

                if (args.length != 1)
                {
                        System.out.println("参数不对或者没有输入参数");
                        System.exit(0);
                }
                File file = new File(args[0]);  //命令行参数就是将要上传的文件名
                FileInputStream fis = new FileInputStream(file);   //用来读取所传文件中的内容
                OutputStream out = s.getOutputStream();  //将文件的内容上传到服务器端
               
                //以下代码将所上传的文件的文件名发送给服务器端
                PrintWriter pw = new PrintWriter(s.getOutputStream(), true);
                String name = file.getName();
                pw.println(name);
                System.out.println("文件名:"+name);

                //判断服务器端是否成功获取文件名
                BufferedReader brIn = new BufferedReader(new InputStreamReader(s.getInputStream()));
                String isOK = brIn.readLine();        //readLine,阻塞式方法,利用该方法阻止程序持续向服务器上传
                //如果服务器端获取名字成功,则会返回"OK"
                if (isOK.equals("OK"))
                {
                        //以下代码当服务器端获取名字成功,才继续向服务器端上传文件的内容        
                        byte[] buf = new byte[1024];
                        while (fis.read(buf) != -1)
                        {
                                out.write(buf, 0, buf.length);
                        }
                        fis.close();
                        s.close();
                }
        }
}
//服务端
class TransServer
{
        public static void main(String[] args) throws Exception
        {
                ServerSocket ss = new ServerSocket(10006);

                Socket s = ss.accept();
                //System.out.println(s.getInetAddress().getHostName()+".......connect");
                InputStream is = s.getInputStream();  //读取Socket流中的数据
                FileOutputStream fos = null;

                //这里先将客户端所上传的文件的文件名获取到,采用字符流
                BufferedReader brIn = new BufferedReader(new InputStreamReader(s.getInputStream()));
                String name = brIn.readLine();
                //String name = Arrays.toString(buf);
                System.out.println("从客户端获取到的文件名是:"+name);
                PrintWriter pw = new PrintWriter(s.getOutputStream(), true);
                pw.println("OK");  //成功读取到文件名,告诉客户端OK

                //判断客户端上传的文件是否在本机当前目录中内存在,如果存在则另外命名,反之以该文件名作为名字
                File file = new File(name);
                fos = new FileOutputStream(file);
                int count = 0;  //定义一个变量,协助为将要存储到硬盘的文件命名
                String[] names = name.split(".");
                /*while (true)
                {
                        if (file.exists())
                        {
                                fos = new FileOutputStream(names[0]+(count++)+"."+names[1]);
                        }
                        else
                        {
                                fos = new FileOutputStream(name);
                                break;
                        }
                }*/
                //定义一个字节数组,用来存储从Socket读取流中读取出来的内容
                byte[] buf = new byte[1024];
                while (is.read(buf) != -1)
                {
                        fos.write(buf, 0, buf.length);
                }
                fos.close();
                ss.close();
        }
}

/*所遇到的问题:
1.如何在服务器获取客户端所上传文件的文件名。
        客户端我利用readLine,阻塞式方法来阻止程序持续向服务器上传。因为如果不阻止一下的话,文件的内容会跟
        着文件名一起通过Socket通道发送给服务器。在服务器端读取的时候,文件名与文件内容无法分开。等到服务器
        成功获取到客户端的名字后,再告知客户端OK了,客户端这才开始上传数据。
        这样弄好麻烦,多定义了四个流。有没有更简单的办法呢?
2.刚开始我全部用在字节流。结果就是这样:比如说我要上传的文件名是1.jpg。那么我在服务器端读取到的名字先是
        字节数组,保存在Byte[] bur中,bur里的内容是:{49, 46, 106, 112, 103},我用bur.toString(),打印的是地址
        用Arrays.toString(bur),结果是[49, 46, 106, 112, 103],请问怎么把{49, 46, 106, 112, 103}变成"1.jpg"。
        即bur--->String???
3.语句:fos = new FileOutputStream(names[0]+(count++)+"."+names[1]);为什么会报数组越界。


*/

1 个回复

正序浏览
     if (args.length != 1)
                {
                        System.out.println("参数不对或者没有输入参数");
                        System.exit(0);
                }
需要先判断传入的参数是否为空
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马