2013-03-07 1 views
0

Как указано в моем заголовке, я пытаюсь создать очень простую службу передачи файлов в java. Прямо сейчас, все, что я смог сделать, создать простой клиент/сервер, который может отправлять и получать строки текста. Вот код:Java - возникли проблемы с попыткой создать простую службу передачи файлов

UDPClient.java:

import java.io.*; 
import java.net.*; 
class UDPClient { 
public static void main(String args[]) throws Exception 
{ 
    BufferedReader inFromUser = 
     new BufferedReader(new InputStreamReader 
      (System.in)); 
    DatagramSocket clientSocket = new DatagramSocket();//port # is assigned by OS to the client 
    InetAddress IPAddress = 
     InetAddress.getByName("localhost"); 
    byte[] receiveData = new byte[1024]; 
    String sentence = inFromUser.readLine(); 
    byte[] sendData = sentence.getBytes(); 
    DatagramPacket sendPacket = 
     new DatagramPacket(sendData, sendData.length, 
          IPAddress, 7777); //data with server's IP and server's port # 
    clientSocket.send(sendPacket); 
    DatagramPacket receivePacket = 
     new DatagramPacket(receiveData, 
          receiveData.length); 
    clientSocket.setSoTimeout(1000); 
    clientSocket.receive(receivePacket); 
    // we still need to catch the exception and retry 
    String modifiedSentence = 
     new String(receivePacket.getData(), 
        0, 
        receivePacket.getLength()); 
    System.out.println("FROM SERVER:" + 
         modifiedSentence); 
    clientSocket.close(); 
    } 
} 

UDPServer.java

import java.io.*; 
import java.net.*; 
class UDPServer { 
public static void main(String args[]) throws Exception 
{ 
    DatagramSocket serverSocket = new 
     DatagramSocket(7777); //server will run on port #9876 
    byte[] receiveData = new byte[1024]; 
    while(true) 
     { 
      DatagramPacket receivePacket = 
       new DatagramPacket(receiveData, 
            receiveData.length); 
      serverSocket.receive(receivePacket); 
      String sentence = new String(
             receivePacket.getData(), 
             0, 
             receivePacket.getLength()); 
      InetAddress IPAddress = 
       receivePacket.getAddress(); //get client's IP 
      int port = receivePacket.getPort(); //get client's port # 
    System.out.println("client's port # =" + port); 
    System.out.println("client'sIP =" +IPAddress); 
    System.out.println("client's message =" +sentence); 

      String capitalizedSentence = 
       sentence.toUpperCase(); 
      byte[] sendData = capitalizedSentence. 
       getBytes(); 
      DatagramPacket sendPacket = 
       new DatagramPacket(sendData, 
            sendData.length, 
            IPAddress, port); 
      serverSocket.send(sendPacket); 
     } 
    } 
} 

В конце концов, что я хотел бы сделать, это отправить файл путь к серверу, есть сервер верните файл и сохраните его в заданном месте, например C: \ Desktop \ Folder.

Я действительно в недоумении, как продвигаться вперед, где я, поэтому любые советы, указатели или ресурсы, которые вы могли бы поделиться, были бы замечательными. Я очень новичок в этом и чувствую выход из своей глубины.

Спасибо!

+0

Вот один указатель: не используйте 'UDP' для передачи файлов, его ненадежной, используйте вместо' TCP'. – Reimeus

+0

@Reimeus На самом деле это [User Datagram Protocol] (http://www.ietf.org/rfc/rfc768.txt). – EJP

ответ

2

В отличие от TCP UDP использует непостоянное соединение. Следовательно, вам нужно будет поддерживать состояние в пакетах запроса и ответа.

Например, пакет запроса может выглядеть следующим образом.

  • 2 байта - длина файла имя
  • (переменная) - имя файла 4 байта - Начальное положение
  • 4 байта - Seq. нет.
  • 4 байта - Максимальный размер куска

Сервер будет читать Шифрование до «Максимальный размер куска» байт из «Исходное положение» и вернуться к клиенту в следующем формате. Seq. нет. будет отозван назад от запроса, чтобы клиент мог связать запрос с ответом.

  • 1 байт - код ответа
  • 4 байта - ПОСЛ. нет.
  • 4 байта - длина Payload
  • (переменная) - Payload