Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.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_Sockets_Client Server_Dataoutputstream - Fatal编程技术网

Java 客户端-服务器应用程序文件传输

Java 客户端-服务器应用程序文件传输,java,sockets,client-server,dataoutputstream,Java,Sockets,Client Server,Dataoutputstream,我目前正在尝试设计一个客户机-服务器应用程序,类似这样:用户连接到服务器,当身份验证正常时,服务器向用户发送一些文件。问题是这些文件都写在一个文件中(使用我的方法) 下面是一些代码: 传输文件的函数 public void processFile(int id, DataOutputStream oStream, Socket socket, int tip){ String fileName; if(tip==0){ fileName="

我目前正在尝试设计一个客户机-服务器应用程序,类似这样:用户连接到服务器,当身份验证正常时,服务器向用户发送一些文件。问题是这些文件都写在一个文件中(使用我的方法)

下面是一些代码:

传输文件的函数

public void processFile(int id, DataOutputStream oStream, Socket socket, int tip){
        String fileName;
        if(tip==0){
            fileName="File"+Integer.toString(Intrebari[id])+".txt";
        }else{
            fileName="Image"+Integer.toString(Intrebari[id])+".jpg";
        }
        byte[] buffer=null;
        int bytesRead = 0;
        FileInputStream file=null;

        try {
            file = new FileInputStream(fileName);
            buffer = new byte[socket.getSendBufferSize()];
            while((bytesRead = file.read(buffer))>0)
                {
                oStream.write(buffer,0,bytesRead);
                }
            file.close();
        } catch (IOException ex) {
           System.out.println(ex);
        }

    }
以及选择要发送的文件的函数

private void send(int id) throws IOException {
        os.writeBytes("sendFile" + id+"\n");

        System.out.println("sendFile" + id);
        generatedFiles.processFile(id, os, comunicare, 0);
        if (generatedFiles.Imagini[id] == 1) {
            os.writeBytes("sendImage" + id+"\n");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException ex) {
                Logger.getLogger(clientThread.class.getName()).log(Level.SEVERE, null, ex);
            }
            System.out.println("sendImage" + id);
            generatedFiles.processFile(id, os, comunicare, 1);
        }
    }
我必须提到
os
DataOutputStream
comunicare
Socket
类型


我认为问题在于我将
writeBytes
write
相结合。有人能帮我解决这个问题吗?如何使服务器和客户端同时接收文件和消息

我会这样做:

服务器发送命令 服务器-发送文件 客户端-确认文件已成功完成

服务器发送命令 服务器-发送文件 客户端-确认文件已成功完成

像这样…假设你有一个来自客户端的套接字,那么你

socket.getOutputStream.write(“文件:SomeFile.bin,大小:872973493\r\n”).getBytes(“选择编码”)) socket.getOutputStream.flush();(如果您希望得到服务器字符串响应,则只需刷新,如:OK向我发送文件,IM就绪,否则无需刷新) 客户机读取并看到这是一个文件,它有这个字节大小,所以它开始从socket.getInputStream读取,直到获得预期的文件长度。 在这之后,客户确认他收到了文件

然后服务器可以发送另一个文件,您可以使用IMAGE:或任何您想要的方法来代替file。您只需从客户端读取消息,查看它是文件还是图像

以下是一些可能对您有所帮助的功能:

public static void readInputStreamToFile(InputStream is, FileOutputStream fout,
        long size, int bufferSize) throws Exception
{
    byte[] buffer = new byte[bufferSize];
    long curRead = 0;
    long totalRead = 0;
    long sizeToRead = size;
    while(totalRead < sizeToRead)
    {
        if(totalRead + buffer.length <= sizeToRead)
        {
            curRead = is.read(buffer);
        }
        else
        {
            curRead = is.read(buffer, 0, (int)(sizeToRead - totalRead));
        }
        totalRead = totalRead + curRead;
        fout.write(buffer, 0, (int) curRead);
    }
}


public static void writeFileInputStreamToOutputStream(FileInputStream in, OutputStream out, int bufferSize) throws Exception
{
    byte[] buffer = new byte[bufferSize];
    int count = 0;
    while((count = in.read(buffer)) != -1)
    {
        out.write(buffer, 0, count);
    }
}
public static void readInputStreamToFile(InputStream为,FileOutputStream为,
long size,int bufferSize)引发异常
{
字节[]缓冲区=新字节[bufferSize];
长电流=0;
长totalRead=0;
长尺寸读取=尺寸;
while(totalReadif(totalRead+buffer.length非常感谢fredcrs!如果我成功了,我会尝试一下,稍后告诉你。再次感谢!你可以大大简化readInputStreamToFile()。“sizeToRead”只是“size”的一个副本,你永远不会更改它,所以只需使用“size”。if/else可以替换为curRead=in.read(buffer,0,(int)Math.min(buffer.length、size totalRead));非常感谢fredcrs和EJP。根据您的逻辑,我已经成功地传输了文件。一切正常。如果有人对源代码感兴趣,请留言,我会发布。所以基本上您是在重新发明FTP。为什么?这是家庭作业吗?是的,是。我必须做一个多项选择应用程序,所以我必须为用户做一个GUI来输入它是我们输入用户名和密码,然后从服务器下载问题(存储在一些文本文件中)。