【问题标题】:Unable to Transfer File from one pc to another using networking in JAVA无法使用 JAVA 中的网络将文件从一台电脑传输到另一台电脑
【发布时间】:2014-04-30 08:07:58
【问题描述】:

我正在尝试使用中间服务器将文件从一个客户端 1 发送到另一个客户端 2。客户端 1 和客户端 2 都通过网络连接到服务器。为此,我为两个客户端提供了服务器的 IP 地址。 但是由于我的代码中的一些错误,我无法正确传输文件。我正在使用以下代码并且它不起作用,并且在客户端 2(接收器)端,创建的文件是空的。 请在我的代码中找到可能的错误。

服务器代码

`
import java.net.*;
import java.io.*;

public class S1 {


public static void main(String[] args) {

try{

ServerSocket sc1=new ServerSocket(6988);
Socket c1=sc1.accept();
Socket c2=sc1.accept();



DataInputStream dis=new DataInputStream(c1.getInputStream());
int m=c1.getInputStream().available();
byte b2[]=new byte[m];
dis.read(b2);

DataOutputStream dos=new DataOutputStream(c2.getOutputStream());
dos.write(b2);
dos.flush();
dos.close();


}
catch(Exception e){}
}
}

客户端 1(发件人)

import java.io.*;
import java.net.*;

public class C11 {


public static void main(String[] args) {
    try{
        Socket c2=new Socket("127.0.0.1",6988);
        FileInputStream fis=new FileInputStream("f:/abc.jpg");
        File f1=new File("f:/abc.jpg");
        long l1=f1.length();
        int a=(int)l1;
        byte b1[]=new byte[a];
        DataInputStream dis=new DataInputStream(fis);
        dis.read(b1);
        DataOutputStream dout=new DataOutputStream(c2.getOutputStream());
        dout.write(b1);

    }
    catch(Exception e){}
    }

}

客户端 2(接收方)

import java.io.*;
import java.net.*;

public class C22 {


public static void main(String[] args) {
    try{
        Socket c2=new Socket("127.0.0.1",6988);
        DataInputStream dis=new DataInputStream(c2.getInputStream());
        int m=c2.getInputStream().available();
        byte b2[]=new byte[m];
        dis.read(b2);
        FileOutputStream fout=new FileOutputStream("E:\\PRACTICE\\xyz.txt");
        DataOutputStream dos=new DataOutputStream(fout);
        dos.write(b2);
        dos.close();
    }
    catch(Exception e){}
    }
}

【问题讨论】:

  • 你有什么错误吗?
  • @Rahul 不,但代码没有按照我的要求工作。
  • 您不知道自己是否收到错误,因为您忽略了任何异常。至少在所有catch 块中调用e.printStackTrace()

标签: java file networking transfer


【解决方案1】:

常见问题。

nt m=c1.getInputStream().available();
byte b2[]=new byte[m];

来自Javadoc:“使用此方法的返回值来分配用于保存此流中所有数据的缓冲区是不正确的。”

dis.read(b2);

read() 方法返回一个值。你忽略了它。该值可以是 -1,或介于 1 和缓冲区大小之间的正数。您假设读取填充了缓冲区。它没有义务这样做。

dout.write(b1);

应该是这样的

dout.write(b1, 0, count);

其中countread(), 返回的长度,它应该在一个循环中:

while ((count = in.read(buffer)) > 0)
{
    out.write(buffer, 0, count);
}

在两端都使用它,任何大于零的缓冲区大小。我一般用8192。

【讨论】:

    【解决方案2】:

    最明显的错误在这里:

     int m=c2.getInputStream().available();
    

    available 方法只告诉您可以在没有阻塞的情况下读取多少数据,而不告诉您可以从套接字读取多少数据。要读取发送的所有数据,您需要编写一个从套接字读取的循环,直到 read 返回 -1。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-07-08
      • 2012-12-03
      • 2013-08-24
      • 1970-01-01
      • 1970-01-01
      • 2019-07-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多