高手来指点,解决问题马上给分 md5是什么?没用过各位还是先看看我的代码有没有问题,是不是缺少什么东西。我是大肆的学生,我才开始用socket编程,还请各位多帮帮俺 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 對Java的網絡編程不是很了解。。 老大,你全部是内存?不会吧,这样你的java肯定死机啦!你可以每读100k,就写到文件中去! zdhsoft(冬瓜猫):该怎么分包一点一点写进文件呢,给个小例子吧感激中....... int batchSize = 100;//100kbyte[] data;while(true){ data = read batchsize file; if(read size == batchsize){ socket send data. }else if(read size > 0){ socket send data. break; }else{ break; }} getFile 中while(( num= fromClient.read(b,0,fromClient.available())) > 0){ out.write(b,0,num); out.flush();}改成byte[] buffer = new byte[batchSize];while(( num= fromClient.read(buffer,0,batchSize)) > 0){ out.write(buffer,0,num); out.flush();} To:abinleo(风中散发)是多线程的。zdhsoft(冬瓜猫)说得每次发小点的包就是把缓冲区改小一些吧。to:jacklondon(jacklondon),我按你说的改了,我试了,还是老样子,不过效果比以前好点。我觉得主要是客户端没有发一个数据结束传送结束的标志,服务器端会因为网络问题,有时误以为客户端已传完文件,就关了资源,造成文件不完整。我曾试过在客户端发完后用PrintWriter发一个字符串作标志,服务器端接收到这个字符串在关闭,我在服务器端使用BufferedReader来读这个标志字符串,但是老是读不了,是不是BufferedReader连传输文件的流也读了,造成无法接收这个字符串??我觉得解决这一点是个关键,你们帮我看看 有cache的InputStream/OutputStream,在同一个连接上不能重复创建,尤其是BufferedReader,它每次要读取比你需要的更多的数据。你可能只是用一次readLine,但它可能已经把多行的数据都cache了。因此你只能继续使用同一个BufferedReader才可以得到正确的数据。 我的BufferedReader用的是同一个,我这样改的while( ( num= fromClient.read(b,0,100))!=-1 ){ if(num>0){ out.write(b,0,num); out.flush(); if((br.readLine()).equals("end"))//这一句把服务器端程序搞死了。 break; }} (br.readLine()).equals("end")这句肯定是错的,不知道该怎么写了 这是什么东西fromClient=new BufferedInputStream(netClient.getInputStream()); br=new BufferedReader(new InputStreamReader(netClient.getInputStream())); 我不是说过不能这样用了吗?! br=new BufferedReader(new InputStreamReader(netClient.getInputStream())); 这句可以用阿,用它可以读出在传文件流之间的字符串,在读文件流之后确实如你所说,不能再用BufferedReader去读流了,读的数据会几十倍的增加,下午我已经领教过了。我先说一下我奥实现的功能把,就是在传文件之前,先获得客户端发来的文件名称字符串,在获得流,在服务器端读流建立以接收到的字符串为名字的文件。客户端在发完文件流后要给个结束标志。服务器端得到该标志再结束。对这些字符串的操作不就是用PrintWriter和BufferedReader吗? 修改如下,我成功传过 600M 的文件,以下代码用了中文全角空格public class NetConnection extends Thread { private boolean getFile(BufferedInputStream fromClient) { //...... File acceptFile = new File("e:\\" + dwdm + ".exe"); out = new FileOutputStream(acceptFile); try {// while ( (num = fromClient.read(b, 0, fromClient.available())) >// 0) { int BATCH_SIZE = 1024 * 100; byte[] b = new byte[BATCH_SIZE]; while ( (num = fromClient.read(b, 0, BATCH_SIZE)) > 0) { out.write(b, 0, num); out.flush(); } out.close(); //...... }}不要用 available() 函数,不可靠。另外,建议用 BufferedInputStream,BufferedOutputStream 代替 FileInputStream,FileOutputStream, 性能会好很多。 to :jacklondon(jacklondon)我试了你改的方法,还是不稳定,文件还是有时会传得少。不过还是要谢谢 学习JAVA 用JAVA写个 文本 数据库 的问题 (请教下大家 设计的思路) 一个算法问题 一段代码目的是打印2点成一条直线,出了点问题 用JAVA实现检测邮件箱的新邮件,如果附件有文件,把它读出来的程序,希望各位高手给D意见??? 求电子版<<jbuilder实用技术手册>> 和<<java事务处理>>. 求助java? 初级问题,一个数据库连接能不能用来同时create多个statement? 关于开发环境的比较. applet和RandomAccessFile的问题 文件的保存和EXCEL报表的输出 请问高手:怎样在JVM中,使用自己的ClassLoader,
你可以每读100k,就写到文件中去!
感激中.......
byte[] data;
while(true){
data = read batchsize file;
if(read size == batchsize){
socket send data.
}else if(read size > 0){
socket send data.
break;
}else{
break;
}
}
while(( num= fromClient.read(b,0,fromClient.available())) > 0){
out.write(b,0,num);
out.flush();
}
改成
byte[] buffer = new byte[batchSize];
while(( num= fromClient.read(buffer,0,batchSize)) > 0){
out.write(buffer,0,num);
out.flush();
}
zdhsoft(冬瓜猫)说得每次发小点的包就是把缓冲区改小一些吧。
to:jacklondon(jacklondon),我按你说的改了,我试了,还是老样子,不过效果比以前好点。我觉得主要是客户端没有发一个数据结束传送结束的标志,服务器端会因为网络问题,有时误以为客户端已传完文件,就关了资源,造成文件不完整。
我曾试过在客户端发完后用PrintWriter发一个字符串作标志,服务器端接收到这个字符串在关闭,我在服务器端使用BufferedReader来读这个标志字符串,但是老是读不了,是不是BufferedReader连传输文件的流也读了,造成无法接收这个字符串??
我觉得解决这一点是个关键,你们帮我看看
但它可能已经把多行的数据都cache了。因此你只能继续使用同一个BufferedReader才
可以得到正确的数据。
while( ( num= fromClient.read(b,0,100))!=-1 ){
if(num>0){
out.write(b,0,num);
out.flush();
if((br.readLine()).equals("end"))//这一句把服务器端程序搞死了。
break;
}
}
fromClient=new BufferedInputStream(netClient.getInputStream());
br=new BufferedReader(new InputStreamReader(netClient.getInputStream())); 我不是说过不能这样用了吗?!
在获得流,在服务器端读流建立以接收到的字符串为名字的文件。客户端在发完文件流后要给个结束标志。服务器端得到该标志再结束。对这些字符串的操作不就是用PrintWriter和BufferedReader吗?
public class NetConnection extends Thread {
private boolean getFile(BufferedInputStream fromClient) {
//......
File acceptFile = new File("e:\\" + dwdm + ".exe");
out = new FileOutputStream(acceptFile);
try {
// while ( (num = fromClient.read(b, 0, fromClient.available())) >
// 0) { int BATCH_SIZE = 1024 * 100;
byte[] b = new byte[BATCH_SIZE];
while ( (num = fromClient.read(b, 0, BATCH_SIZE)) >
0) { out.write(b, 0, num);
out.flush();
}
out.close(); //......
}
}
不要用 available() 函数,不可靠。
另外,建议用 BufferedInputStream,BufferedOutputStream 代替 FileInputStream,FileOutputStream, 性能会好很多。
我试了你改的方法,还是不稳定,文件还是有时会传得少。
不过还是要谢谢