本帖最后由 cvnmklop 于 2014-11-14 23:30 编辑
谢谢你的回答,ServerRec是我手动建立的。你的建议是正确,确实应该判断文件夹的存在。这个问题我自己今天解决了。
错误原因是服务端接收客户端文件名出了问题。服务端接收文件名的缓冲区定义了1024个字节。但是客户端传送的文件名达不到1024字节。那么就会在有效的字节后面空出来很多0。我在读缓冲区的时候String fileName = new String(bufin,0,bufin.length);是把整个缓冲区都读了进来,而缓冲区里有很多0结果就是把很多的0也读了进来。在内存中转换成字符串的时候java默认的编码是unicode,这样0就会被编码成了null(注意:这个null跟java的null不同,这个null的unicode编码值为\u0000,用System.out.print("\u0000")输出的结果就是空格),可想而知fileName里面有很多null即fileName="ServerRec/client.txtnullnullnull......null"。在创建文件的时候系统把多余的null也当作文件的路径了。这样就会报错FileNotFoundException: Invalid file path(无效文件路径)
这个查找之所以困难,甚至在debug下我也看不出来的问题在于
在调试时用打印语句查看System.out.println(fileName);输出语句打印了null形式上为空格,但是直观上看到的结果是ServerRec/client.txt这个正确的结果。在debug观察fileName的值时看到的情况跟打印语句的情况相同。这样就造成了困惑
从这次编写代码的教训,我知道了一定要读取有效的字节。read(byte[] by)一定要获得它读到的有效字节数。而不仅仅是为了读取。
谢谢大家的帮助,也要谢谢毕老师的视频,当我再次回顾视频的时候发现了这个严重的错误。
我把里面凡是涉及到的read(byte[] by)方法都进行了更改。
更改的代码如下:
- class Server{
- public static void main(String[] args)throws Exception{
-
- ServerSocket serversocket = new ServerSocket(20000);
- Socket csocket = serversocket.accept();
- System.out.println(csocket.getInetAddress().getHostAddress()+" 连接成功");
-
- BufferedInputStream bisin = new BufferedInputStream(csocket.getInputStream());
- BufferedWriter bwout = new BufferedWriter(new OutputStreamWriter(csocket.getOutputStream()));
-
- byte[] bufin = new byte[1024];
-
- int fileNameLen = bisin.read(bufin);//接收客户端上传的文件名
- String fileName = new String(bufin,0,fileNameLen);
- //String fileName = new String(bufin,0,bufin.length);这样写是错误的,因为当文件名小于1024字节会出现,String里面会接收到很多Null,系统会把Null也当作路径,这样就会报错Invalid file path
-
- fileName = "ServerRec/"+fileName;
- System.out.println(fileName);
-
- BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(fileName));
- bwout.newLine();//向客户端发送服务端创建与客户端上传文件相同的名称的文件成功
- bwout.flush();
-
- int len = 0;
- byte[] buf = new byte[1024];
- while((len=bisin.read(buf))!=-1){
- bos.write(buf,0,len);
- bos.flush();
- }
-
-
- bwout.write("上传成功");//反馈给客户端的信息
- bwout.flush();
-
- bos.close();
- csocket.close();
- }
-
- }
复制代码
- class Client{
- public static void main(String[] args)throws Exception{
-
- Socket socket = new Socket("127.0.0.1",20000);
-
- BufferedOutputStream bosout = new BufferedOutputStream(socket.getOutputStream());
- BufferedReader brin = new BufferedReader(new InputStreamReader(socket.getInputStream()));
-
- File sendFile = new File("client.txt");//要上传的文件
-
- bosout.write(sendFile.getName().getBytes());//传送要上传的文件名给服务端
- bosout.flush();
-
- brin.readLine();//获取服务端创建文件成功信号
-
- BufferedInputStream bis = new BufferedInputStream(new FileInputStream(sendFile));
-
- byte[] buf = new byte[1024];
- int len =0;
- while((len =bis.read(buf))!=-1){
- bosout.write(buf,0,len);
- bosout.flush();
- }
- socket.shutdownOutput();//给服务端发送文件结束标记
-
- System.out.println(brin.readLine());
-
- bis.close();
- socket.close();
- }
- }
复制代码
|