我正在尝试使用中间服务器将文件从一个客户端1发送到另一个客户端2。客户端1和客户端2都通过网络连接到服务器。为此,我已经为两个客户端提供了服务器的IP地址。 但由于我的代码中存在一些错误,我无法正确传输文件。我使用以下代码并且它不起作用,并且在客户端2(接收器' s)结束时,创建的文件为空。 请在我的代码中找到可能的错误。
`
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){}
}
}
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){}
}
}
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){}
}
}
答案 0 :(得分: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);
其中count
是read(),
返回的长度,它应该在一个循环中:
while ((count = in.read(buffer)) > 0)
{
out.write(buffer, 0, count);
}
两端都使用此选项,任何缓冲区大小都大于零。我通常使用8192。
答案 1 :(得分:0)
最明显的错误在于:
int m=c2.getInputStream().available();
available
方法仅告诉您可以在不阻塞的情况下读取多少数据,而不是可以从套接字读取多少数据。要读取发送的所有数据,您需要编写一个从套接字读取的循环,直到read
返回-1。