简体   繁体   English

发送整数值,然后将整个文件从客户端发送到Java中的服务器

[英]Send an integer value, then an entire file from client to server in java

Basically, this is what I have done:- Client side 基本上,这就是我所做的:-客户端

public class Client {

    public String uploadFile(String filePath,int language) throws Exception {
        Socket sock = new Socket("127.0.0.1", 25000);


        // make the file object from filepath
        File myFile = new File(filePath);

        // send the integer 'language'
        OutputStream os = sock.getOutputStream();
        OutputStreamWriter osw = new OutputStreamWriter(os);
        BufferedWriter bw = new BufferedWriter(osw);
        bw.write(language);
        bw.flush();

        // send the file data
        byte[] mybytearray = new byte[(int) myFile.length()];
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream(
                myFile));
        bis.read(mybytearray, 0, mybytearray.length);
        os.write(mybytearray, 0, mybytearray.length);
        os.flush();
        bis.close();

        // get the reply
        InputStream is = sock.getInputStream();
        InputStreamReader isr = new InputStreamReader(is);
        BufferedReader br = new BufferedReader(isr);
        String message = br.readLine();

        sock.close();

        return message;

    }
}

Server side:- 服务器端:-

 void connectToNewClient(Socket sock) throws IOException,
            InterruptedException {

        // get the integer 'language'

        InputStream is = sock.getInputStream();
        InputStreamReader isr = new InputStreamReader(is);
        BufferedReader br = new BufferedReader(isr);
        String language = br.readLine();

        // Read file data sent by client and store in server
        byte[] mybytearray = new byte[50000];
        FileOutputStream fos = new FileOutputStream("Main.txt");
        BufferedOutputStream bos = new BufferedOutputStream(fos);
        int bytesRead = is.read(mybytearray, 0, mybytearray.length);
        bos.write(mybytearray, 0, bytesRead);
        bos.close();

        // give back response
        OutputStream os = sock.getOutputStream();
        OutputStreamWriter osw = new OutputStreamWriter(os);
        BufferedWriter bw = new BufferedWriter(osw);
        bw.write(response);

        bw.flush();

        sock.close();

    }

So my problem is that when I send only the file or only the integer from client, I can receive them at server side, but, when I try sending them both together I do not receive anything at server side. 所以我的问题是,当我仅从客户端发送文件或整数时,我可以在服务器端接收它们,但是当我尝试同时发送它们时,在服务器端却什么也没收到。 Guess I have messed up with so many writer objects and data stream objects. 猜猜我搞砸了这么多作家对象和数据流对象。 Please help with where I have gone wrong. 请帮我弄错地方。 Thank you. 谢谢。 NOTE: I have removed a few lines of code in between which I thought were not relevant to my problem. 注意:我删除了几行我认为与问题无关的代码。

You're wrapping your stream inside a BufferedWriter which is usually a good thing for a number of reasons. 您将流包装在BufferedWriter中,由于多种原因,这通常是一件好事。 The weird thing with your code is that you're using that writer for the Integer, and the unwrapped OutputStream for the File. 您的代码奇怪的是,您正在使用该编写器作为Integer,而使用未包装的OutputStream作为文件。 I suspect that the two write operations cannot be used without reinstantiating the writer. 我怀疑如果不重新初始化编写器就无法使用这两个写操作。

I suggest you to refactor your code using only one writer. 我建议您仅使用一个编写器来重构代码。 I would choose the more general ObjectOutputStream which allows you to send objects implementing the Serializable interface (your scenario already satisfy this constraint). 我会选择更通用的ObjectOutputStream ,它允许您发送实现Serializable接口的对象(您的方案已经满足此约束)。 You can receive directly the objects via ObjectInputStream. 您可以通过ObjectInputStream直接接收对象。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM