отправить файл, затем сообщение через сокет - PullRequest
4 голосов
/ 01 июля 2011

Я пытаюсь отправить файл с клиента на сервер. Сервер получает файл и затем отправляет клиенту подтверждающее сообщение.

Моя проблема в том, что клиент перестает отвечать на запросы, ожидая подтверждения.

Сервер:

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

public class Server {
public static void main(String args[]) throws IOException {
        int port = 1234;
    ServerSocket server_socket;

    server_socket = new ServerSocket(port);
    System.out.println("Server waiting for client on port "
            + server_socket.getLocalPort());
    // server infinite loop
    while (true) {
        Socket socket = server_socket.accept();
        System.out.println("New connection accepted "
                + socket.getInetAddress() + ":" + socket.getPort());
    try {
                byte[] b = new byte[1024];
                int len = 0;
                int bytcount = 1024;
                String FileName = "C:\\test\\java\\tmp\\sentfile.pdf"; 
                FileOutputStream inFile = new FileOutputStream(FileName);
                InputStream is = socket.getInputStream();
                BufferedInputStream in2 = new BufferedInputStream(is, 1024);
                while ((len = in2.read(b, 0, 1024)) != -1) {
                    bytcount = bytcount + 1024;
                inFile.write(b, 0, len);
                }
                System.out.println("Bytes Writen : " + bytcount);

                //Sending the response back to the client.
                ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
                oos.flush();
                oos.writeObject("ok");
                System.out.println("Message sent to the client is "+"ok");

                in2.close();
                inFile.close();
            } catch (IOException e) {
        System.out.println("Unable to open file" + e);
        return;
    }
    socket.close();
    System.out.println("Connection closed by client");
        }
}
}

Клиент:

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

public class Client {
    public static void main(String[] args) throws UnknownHostException,
        IOException, ClassNotFoundException {

        int port = 1234;
    Socket socket = null;

    // connect to server
    socket = new Socket("127.0.0.1", port);

    try {
            byte[] buf = new byte[1024];
            OutputStream os = socket.getOutputStream();
            BufferedOutputStream out = new BufferedOutputStream(os, 1024);
            String file = "C:\\test\\java\\client\\source.pdf"; 
            FileInputStream in = new FileInputStream(file);
            int i = 0;
            int bytecount = 1024;
            while ((i = in.read(buf, 0, 1024)) != -1) {
                bytecount = bytecount + 1024;
            out.write(buf, 0, i);
            out.flush();
            }
            System.out.println("Bytes Sent :" + bytecount);

            ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
            String confirmation = (String) ois.readObject();
            System.out.println("from server : " + confirmation);

            out.close();
            in.close();
    } catch (IOException e) {
    System.out.println(e);
    }
    socket.close();
}
}

Ответы [ 2 ]

7 голосов
/ 01 июля 2011

Вот полный рабочий пример. Сервер:

package so6540787;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {

  private final Socket socket;

  public Server(Socket socket) {
    this.socket = socket;
  }

  public void receiveFile(File file) throws IOException {
    byte[] b = new byte[1024];
    int len = 0;
    int bytcount = 1024;
    FileOutputStream inFile = new FileOutputStream(file);
    InputStream is = socket.getInputStream();
    BufferedInputStream in2 = new BufferedInputStream(is, 1024);
    while ((len = in2.read(b, 0, 1024)) != -1) {
      bytcount = bytcount + 1024;
      inFile.write(b, 0, len);
    }
    System.out.println("Bytes Writen : " + bytcount);

    // Sending the response back to the client.
    ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
    oos.flush();
    oos.writeObject("ok");
    System.out.println("Message sent to the client is " + "ok");

    in2.close();
    inFile.close();
  }

  public static void main(String[] args) throws IOException {
    ServerSocket listen = new ServerSocket(10000, 1);
    Socket socket = listen.accept();
    Server server = new Server(socket);
    server.receiveFile(new File("c:/received.pdf"));
  }
}

А клиент:

package so6540787;

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.OutputStream;
import java.net.Socket;

public class Client {

  private final Socket socket;

  public Client(Socket socket) {
    this.socket = socket;
  }

  public void sendFile(File file) throws IOException, ClassNotFoundException {
    byte[] buf = new byte[1024];
    OutputStream os = socket.getOutputStream();
    BufferedOutputStream out = new BufferedOutputStream(os, 1024);
    FileInputStream in = new FileInputStream(file);
    int i = 0;
    int bytecount = 1024;
    while ((i = in.read(buf, 0, 1024)) != -1) {
      bytecount = bytecount + 1024;
      out.write(buf, 0, i);
      out.flush();
    }
    socket.shutdownOutput(); /* important */
    System.out.println("Bytes Sent :" + bytecount);

    ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
    ois.skip(Long.MAX_VALUE);
    String confirmation = (String) ois.readObject();
    System.out.println("from server : " + confirmation);

    out.close();
    in.close();
  }

  public static void main(String[] args) throws IOException, ClassNotFoundException {
    Client client = new Client(new Socket("localhost", 10000));
    client.sendFile(new File("c:/tobesent.pdf"));
  }
}

Строка, которую вы пропустили, это "socket.shutdownOutput ()". Если вы пропустите эту строку, сервер никогда не увидит маркер конца файла -1 из вызова read.

Пожалуйста, исправьте способ подсчета байтов, которые были отправлены. Вам действительно следует начинать с 0 вместо 1024 и увеличивать счетчик только на столько байтов, сколько вы действительно прочитали.

0 голосов
/ 01 июля 2011

Используйте HTTP! Он предназначен именно для этого типа проблемы. Для Java доступно множество библиотек HTTP-клиентов и серверов.

...