Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过java套接字发送文件_Java_File_Sockets - Fatal编程技术网

通过java套接字发送文件

通过java套接字发送文件,java,file,sockets,Java,File,Sockets,我在谷歌搜索了几个小时,试图找出如何通过java套接字成功发送任何文件。我在网上发现了很多东西,但似乎没有一件对我有用。我最终遇到了在服务器和客户端之间发送文件的对象输出/输入流,这是迄今为止我发现的唯一有效的东西,但它似乎只在与本地主机的连接上起作用。例如,如果我从另一个网络上的朋友的计算机连接到服务器并发送一个文件,它失败了,套接字关闭并说“读取超时”,然后在重新连接后不久,文件就不会被发送。如果我连接到服务器上的localhost并发送文件,它就可以正常工作。那么问题出在哪里?我该如何解决

我在谷歌搜索了几个小时,试图找出如何通过java套接字成功发送任何文件。我在网上发现了很多东西,但似乎没有一件对我有用。我最终遇到了在服务器和客户端之间发送文件的对象输出/输入流,这是迄今为止我发现的唯一有效的东西,但它似乎只在与本地主机的连接上起作用。例如,如果我从另一个网络上的朋友的计算机连接到服务器并发送一个文件,它失败了,套接字关闭并说“读取超时”,然后在重新连接后不久,文件就不会被发送。如果我连接到服务器上的localhost并发送文件,它就可以正常工作。那么问题出在哪里?我该如何解决

编辑:下面是更新的代码。。动作极其缓慢

public synchronized File readFile() throws Exception {
    String fileName = readLine();
    long length = dis.readLong();
    File temp = File.createTempFile("TEMP", fileName);
    byte[] buffer= new byte[1000];
    int count=0;
    FileOutputStream out = new FileOutputStream(temp);
    long total = 0;
    while (total < length && (count = dis.read(buffer, 0, (int)Math.min(length-total, buffer.length))) > 0)
    {
        System.out.println(total+" "+length+" "+temp.length()); //Just trying to keep track of where its at...
        out.write(buffer, 0, count);
        total += count;
    }
    out.close();
    return temp;
}


public synchronized void writeFile(File file) throws Exception {
    writeString(file.getName());
    long length = file.length();
    dos.writeLong(length);
    byte[] buffer= new byte[1000];
    int count=0;
    FileInputStream in = new FileInputStream(file);
    long total = 0;
    while (total < length && (count = dis.read(buffer, 0, (int)Math.min(length-total, buffer.length))) > 0)
    {
        System.out.println(total+" "+length); //Just trying to keep track of where its at...
        dos.write(buffer, 0, count);
        total += count;
    }
    in.close();
}
public synchronized File readFile()引发异常{
字符串文件名=readLine();
long length=dis.readLong();
File temp=File.createTempFile(“temp”,文件名);
字节[]缓冲区=新字节[1000];
整数计数=0;
FileOutputStream out=新的FileOutputStream(临时);
长总计=0;
而(总0)
{
System.out.println(total+“”+length+“”+temp.length());//只是试图跟踪它的位置。。。
out.write(缓冲区,0,计数);
总数+=计数;
}
out.close();
返回温度;
}
公共同步的无效写入文件(文件)引发异常{
writeString(file.getName());
long length=file.length();
dos.writeLong(长度);
字节[]缓冲区=新字节[1000];
整数计数=0;
FileInputStream in=新的FileInputStream(文件);
长总计=0;
而(总0)
{
System.out.println(total+“”+length);//只是试图跟踪它的位置。。。
写(缓冲区,0,计数);
总数+=计数;
}
in.close();
}

客户端和服务器都有writeFile和readFile。目前,我正在使用它发送和显示图像

不要为此使用对象流。使用
DataInputStream
DataOutputStream:

  • 使用
    writeUTF()
    readUTF()
    发送和接收文件名
  • 发送和接收数据,如下所示:

    while ((count = in.read(buffer)) > 0)
    {
        out.write(buffer, 0, count);
    }
    
    long length = in.readLong();
    long total = 0;
    while (total < length && (count = in.read(buffer, 0, length-total > buffer.length ? buffer.length : (int)(length-total))) > 0)
    {
        out.write(buffer, 0, count);
        total += count;
    }
    
    您可以在两端使用此代码<代码>缓冲区可以是大于零的任何大小。它不需要是文件的大小,也不会扩展到大文件

  • 合上插座

  • 如果需要发送多个文件,或者需要保持套接字打开,请执行以下操作:

  • 使用
    writeLong()
    发送文件前面的长度,然后使用
    readLong()
    读取并修改循环,如下所示:

    while ((count = in.read(buffer)) > 0)
    {
        out.write(buffer, 0, count);
    }
    
    long length = in.readLong();
    long total = 0;
    while (total < length && (count = in.read(buffer, 0, length-total > buffer.length ? buffer.length : (int)(length-total))) > 0)
    {
        out.write(buffer, 0, count);
        total += count;
    }
    
    long length=in.readLong();
    长总计=0;
    而(总buffer.length?buffer.length:(int)(总长度))大于0)
    {
    out.write(缓冲区,0,计数);
    总数+=计数;
    }
    
    不要关上插座。请注意,在读取之前必须测试
    total
    ,并且必须调整read length参数,以免超出文件末尾


  • 您尝试连接的套接字的IP地址和端口是什么?可能已被防火墙阻止。我可以确认该套接字能够完美地连接到服务器,只是在发送文件时出现问题。(它仍在读取服务器发送的名称和其他内容)@JohnEpix套接字位于服务器上,防火墙后面。插座在哪个端口上?您是否已将该端口从路由器转发到服务器?您是否试图通过WAN IP或屏蔽IP进行连接?端口已转发,外部网络可以连接并执行所有操作,但传输文件(我使用朋友检查)评论不用于扩展讨论;这段对话已经结束。