作者twonia (小东)
看板java
标题[问题] 传送档案写法的疑问
时间Mon Apr 30 21:55:05 2012
不好意思小弟又来发问了= =a
先跟上次很用心帮我的人说声感谢(LaPass和tkcn两位)
经过了一段时间的奋战
我的整个程式大致底定
能传档案
能看目录
但是却有一个我不知道该怎嚜解决的地方
这是Client端实做put的程式码
String filen = comm.substring(4,comm.length());
System.out.println(filen);
File file = new File(filen);
try
{
FileInputStream fos = new FileInputStream(file);
OutputStream netOut = clientSocket.getOutputStream();
OutputStream doc = new DataOutputStream(new BufferedOutputStream(netOut));
byte[] buf = new byte[2048];
int num = fos.read(buf);
while (num != ( - 1)) //是否读完文件
{
doc.write(buf, 0, num); //把文件资料写出网络缓冲区
doc.flush(); //重整缓冲区把资料写往客户端
num = fos.read(buf); //继续从文件中读取资料
}
System.out.println("File "+ filen +" has been uploaded to FTPServer "
+ serverAddress);
fos.close();
doc.close();
}catch(Exception e) {
e.printStackTrace();
}
}
以及Server端再Client打put时接收档案的程式码
String fileName = get.substring(4,get.length());
String l = inFromClient.readLine();
File file = new File(fileName); //如果文件已经存在,先删除
if (file.exists()) file.delete();//
int ts = 0;
RandomAccessFile raf = new RandomAccessFile(file, "rw");
InputStream netIn = cs.getInputStream();
InputStream in =new DataInputStream(new BufferedInputStream(netIn)); //
len =Long.parseLong(l) ;
byte[] buf = new byte[2048];
while (true) //是否读完所有资料
{
int num = 0;
if(in != null)
{
num = in.read(buf);
}
ts += num;
if(ts == num)
{
break;
}
raf.write(buf, 0, num); //将资料写往文件
}
System.out.println("ftpserver>Client "+ clientAddressString+" has
uploaded the file : " + fileName);
comm = "";//初始化comm使他离开put执行
//in.close();
raf.close();
这是新的Server
但是这样子变成= =a
完全不会写入档案了orz
虽然有跑出那端成功上传的话
但是实际上全部都卡在getInputStream了
虽然执行上可以让client再输入下一个指令
但是输入第二个指令出现
NumberFormatException:test01put test02.txt
也就是我test01.txt里的test01没被丢进文件= =a
反而直接卡住了...
到底错在哪里呢ˊˋ
----------------------
基本上两段程式码
经过测试
都是能成功传送档案无误
但是问题却出在最後的close这个东西上...
一但close掉
我要再传送一次
就会出现socket is close的状况
但是如果我不关掉
另外一端却会无法接收结束
一直处於接收中的while回圈里出不来
EX:
Clinet输入put test01.txt
Server接收到test01.txt (确实有传送成功,因为我有故意加字在里面去检查)
Client输入put test02.txt
跳出错误说明写着Socket is close
不知道要用什麽方法才能在不去close任何socket下
而能让对面知道已经传送完成并且结束接收回到等待指令输入的状态
有查到说可以试着先送出档案大小
不过我实作後却一直跑出啥Native method还啥的= =a
所以想请教众版友是否知道如何避免使用close这段程式码
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 61.57.219.8
1F:→ tkcn:在开始传档案之前先传个 "档案大小" 吧,两边沟通好就行了 04/30 22:29
2F:→ twonia:所以是在while(num != -1)外面再包一个侦测档案大小? 04/30 22:48
3F:→ twonia:还是说直接用file.setlength这函式强制设定他? 04/30 22:56
4F:→ tkcn:num!=-1 是在侦测 EOF,也就是断线(close)时才会发生 04/30 23:07
5F:推 LaPass:我那时候很偷懒的使用ObjectStream,所以没什麽问题.... 04/30 23:09
6F:→ LaPass:你现在问的这些,在之後我打算写跨语言的连线时,就遇到了 04/30 23:11
7F:→ LaPass:那时候我的方法是开另外一条连线去传。应该会有更好的方法 04/30 23:13
8F:→ twonia:while (file.length()< Long.parseLong(l)) 这样失败XD 04/30 23:14
9F:→ tkcn:只要定义好协定并让两端确实遵守就可以了,剩下就只是实作。 04/30 23:29
※ 编辑: twonia 来自: 61.57.219.8 (05/01 01:49)
10F:→ twonia:悲剧...作不出来...看了网路的写法依旧失败了= = 05/01 01:50
11F:→ twonia:Server的新程式码已经补在上面原本Server的地方了QAQ 05/01 01:51
12F:→ twonia:结果都不是上述问题= =今天神来一笔解决了~晚点PO方法... 05/01 09:47