2012-10-27 5 views
-2

Привет всем, Я пытаюсь разработать приложение для передачи/отправки файла, как работает SKYPE. Поэтому я использую сокет для передачи файла с одного компьютера (клиента) на другой компьютер (клиент). Я могу передать файл с одного клиента на сервер, используя this. code.But, когда я пытаюсь отправить тот же файл с сервера на второй client.It передача с 0 байт также дать сокет закрыть исключение, поэтому я пытаюсь создать новый объект сокета на стороне клиента. Так что теперь Исключение не придет, но файл не передает к клиенту. После отладки я обнаружил, что файл успешно отправлен клиенту сервером, но на стороне клиента не может читать данные и ждать данных. Я не могу найти лучшего решения. Если кто-нибудь знает что-нибудь об этом Пожалуйста скажите me.if у вас есть какие-либо другие решения для передачи файлов, чем также говорят me.thanks заранее Ниже мой кодОтправка файла от одного клиента другому клиенту с помощью сокета в java

Server code: 

public class ChatServer 
{ 

serversocket = new ServerSocket(1436); 
thread = new Thread(this); 
thread.start(); 

/*************Thread Implementation***************/ 
public void run() 
{ 
    /*********Accepting all the client connections and create a seperate thread******/ 
    while(thread != null) 
    { 
     try 
     { 
      /********Accepting the Server Connections***********/ 
      socket = serversocket.accept();    

    /******* Create a Seperate Thread for that each client**************/ 
      chatcommunication = new ChatCommunication(this,socket); 

      thread.sleep(THREAD_SLEEP_TIME);  
     } 
     catch(InterruptedException _INExc) { ExitServer(); } 
     catch(IOException _IOExc)   { ExitServer(); } 
    } 
} 

protected void SendGroupFile(Socket ClientSocket, String FileName,String GroupName,String UserName) throws IOException 
{ 
    try 
    { 
    // receive file from Client 
     byte [] mybytearray = new byte [filesize]; 
     InputStream is = socket.getInputStream(); 
     FileOutputStream fos = new FileOutputStream(Filepath); 
     BufferedOutputStream bos = new BufferedOutputStream(fos); 
     int bytesRead = is.read(mybytearray,0,mybytearray.length); 
     current = bytesRead; 

      do { 
      bytesRead =is.read(mybytearray, current, (mybytearray.length-current)); 
      System.out.println("Reading Bytes server"+bytesRead); 
      if(bytesRead >= 0) 
       current += bytesRead; 
     } while(bytesRead > -1); 

     bos.write(mybytearray,0,current); 
     bos.flush(); 
     bos.close(); 



    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 

     /***** Function To Send a File to Client **********/ 
protected void SendGroupFileClient(Socket ClientSocket, String FileName,String GroupName,String UserName) 
{ 
     try { 
      int m_userListSize = userarraylist.size(); 

       clientobject = GetClientObject(GroupName); 

       if(clientobject != null) 
       for(G_ILoop = 0; G_ILoop < m_userListSize; G_ILoop++) 
       { 

        clientobject = (ClientObject) userarraylist.get(G_ILoop); 
        if((clientobject.getGroupName().equals(GroupName)) && (!(clientobject.getUserName().equals(UserName)))) 
        { 
        {  

        File myFile = new File (Filepath); 
        byte [] mybytearray = new byte [(int)myFile.length()]; 
        FileInputStream fis = new FileInputStream(myFile); 
        BufferedInputStream bis = new BufferedInputStream(fis); 
        bis.read(mybytearray,0,mybytearray.length); 
        os = socket.getOutputStream(); 
        System.out.println("Sending..."); 
        os.write(mybytearray,0,mybytearray.length); 
        os.flush(); 
        os.close(); 
      } 

     }catch(IOException _IOExc) 
     { 
      _IOExc.printStackTrace(); 
     } 
} 
} 

ChatCommunication .java

public class ChatCommunication implements Runnable,CommonSettings 
{ 
    Thread thread; 
Socket socket; 
DataInputStream inputstream; 
String RFC; 
ChatServer Parent; 

    /********Initialize the Socket to the Client***********/ 
ChatCommunication(ChatServer chatserver,Socket clientsocket) 
{    
    Parent = chatserver; 
    socket = clientsocket; 
    try 
    {  
    inputstream = new DataInputStream(new BufferedInputStream(socket.getInputStream()));  
    }catch(IOException _IOExc) { } 
    thread = new Thread(this); 
    thread.start(); 
} 

public void run() 
{ 
    while(thread != null) 
    { 
     try {    
      RFC = inputstream.readLine(); 

      if(RFC.startsWith("FILEGRUP")) 
      { 
       Parent.SendGroupFile(socket,RFC.substring(9,RFC.indexOf("!")),RFC.substring(RFC.indexOf("!")+1,RFC.indexOf("*")),RFC.substring(RFC.indexOf("*")+1));  
      } 

      if(RFC.startsWith("FILEGET")) 
      { 
       Parent.SendGroupFileClient(socket,RFC.substring(8,RFC.indexOf("!")),RFC.substring(RFC.indexOf("!")+1,RFC.indexOf("*")),RFC.substring(RFC.indexOf("*")+1)); 
      } 


     }catch(Exception _Exc) 
     { 
      Parent.RemoveUserWhenException(socket);QuitConnection(); 
     } 
    } 
} 

Клиентский код

class Client extends JFrame 
{ 
    ServerName="192.168.1.103"; 
    ServerPort=1436; 

Client() 
{ 
    socket = new Socket(ServerName,ServerPort); 
    SendGroupFileToServer(Filepath,SelectedGroup);  
} 

/*******Function To Send File To Server and receiving the file ***********/ 
protected void SendGroupFileToServer(String FileName, String ToGroup) 
{ 
try { 

dataoutputstream.writeBytes(FileName.concat("!").concat(ToUser)+"\r\n"); 
//send file to sever 
      File myFile = new File (FileName.substring(9)); 
      byte [] mybytearray = new byte [(int)myFile.length()]; 
      FileInputStream fis = new FileInputStream(myFile); 
      BufferedInputStream bis = new BufferedInputStream(fis); 
      bis.read(mybytearray,0,mybytearray.length); 
      OutputStream os = socket.getOutputStream(); 
      System.out.println("Sending..."); 
      os.write(mybytearray,0,mybytearray.length); 
      os.flush(); 
      os.close(); 
      System.out.println("File successfully Sended to server"); 
      }catch(IOException _IoExc) { QuitConnection(QUIT_TYPE_DEFAULT);} 


       try { 
      socket1 = new Socket(ServerName,ServerPort); //Creating new Socket          
      dataoutputstream = new DataOutputStream(socket1.getOutputStream()); 
      dataoutputstream.writeBytes("FILEGET"+FileName.concat("!").concat(ToGroup+"*"+UserName)+"\r\n"); //sending string to server   

    } catch (IOException e1) { 
     e1.printStackTrace(); 
    } 

    // receive file sended by server 
     byte [] mybytearray = new byte [filesize]; 
     InputStream is; 
    try { 
     is = socket1.getInputStream(); 

     FileOutputStream fos = new FileOutputStream(Filepath); 
     BufferedOutputStream bos = new BufferedOutputStream(fos); 
     int bytesRead = is.read(mybytearray,0,mybytearray.length); 
     current = bytesRead; //up to this working fine 

     do { 
      bytesRead =is.read(mybytearray, current, (mybytearray.length-current)); //not reading the file data sent by server just waiting and not go ahead 
      if(bytesRead >= 0) 
       current += bytesRead; 
     } while(bytesRead > -1); 

     bos.write(mybytearray,0,current); 
     bos.flush(); 
     bos.close(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    } 

}

+1

Слишком много коды для чтения. Слишком много стилистических зверств. Сожалею. –

+0

ok ... забудьте код. Если у вас есть идея передать файл с одного клиента другому клиенту, используя сокет или любым другим способом, тогда скажите мне, пожалуйста. – krushnakant

+0

Какое исключение? btw http://sscce.org/ – r0ast3d

ответ

3

Есть так много проблем, что трудно понять, с чего начать.

  1. thread.sleep() в петле accept() буквально трата времени. Он не служит никакой полезной цели, за исключением, возможно, снижения курса, на котором принимаются клиенты. Если это не ваше намерение, не делайте этого.

  2. Все, что вы делаете, когда обнаруживаете исключение, покидает сервер, даже не печатая сообщение об исключении. Поэтому, когда что-то идет не так, как здесь, вы не можете знать, что это было. Не делай этого.

  3. readLine() возвращает null в EOS, на котором вы должны закрыть розетку, прекратить чтение и выйти из потока. Вы не проверяете это, и поэтому вы упускаете все три из этих необходимых шагов. Не делай этого.

  4. Вы создаете DataInputStream вокруг BufferedInputStream для использования при чтении команд, но вы не передаете его методам, обрабатывающим эти команды. Вы просто передаете сокет. Поэтому вы теряете данные. Не делай этого. Каждая часть программы должна использовать один и тот же входной поток или считыватель для сокета.

  5. Вы читаете весь файл в памяти. Это (a) предполагает, что размер файла соответствует int; (b) не масштабируется до больших файлов; (c) пространство для отходов, и (d) добавляет латентность. Не делай этого.

  6. Вы игнорируете результат чтения() в этот буфер и считаете его заполненным. Вы не можете этого сделать. Ниже приведен правильный способ копирования потоков в Java. Это работает с буфером любого размера, например. 8192, для ввода любой длины и не требует, чтобы вы заполняли весь ввод в память. Вы можете использовать этот цикл как на клиенте при отправке файла, так и на сервере при его получении.

    while ((count = in.read(buffer)) > 0) 
    { 
        out.write(buffer, 0, count); 
    } 
    
  7. Аналогично (4) выше, вы используете DataOutputStream вокруг BufferedOutputStream для некоторых вещей, и выходной разъем потока непосредственно для других. Не делай этого.Все части программы должны иметь одинаковый выходной поток или запись для сокета.

  8. Вам не нужно flush() до close(); это происходит автоматически.

  9. По какой-то причине после отправки файла вы создаете новое соединение и отправляете другую команду. После этого вы даже не закрываете соединение. У сервера не будет легкого способа узнать, что это соединение и эта команда относятся к файлу, только что отправленному в приведенном выше коде. Это также избыточно, так как получение окончательного EOS сообщает серверу, что файл был успешно отправлен. Не делай этого. Если вам нужно отправить дополнительную информацию с файлом, отправьте его сначала, перед файлом, в том же соединении.

  10. Ссылка, которую вы цитируете, содержит многие из вышеупомянутых проблем. Приложите усилия, чтобы найти авторитетную отправную точку.

+2

+1 для доблестной попытки –

+0

Спасибо, очень за ур ответ ... – krushnakant

+0

Извините, но я не использовал файл и сокет раньше, так что, пожалуйста, коротко расскажите мне о своем третьем шаге (предложение) .Я не получаю это с удовольствием. :( – krushnakant

0

Это решение. Примените эту логику к своему коду.

Я могу отправить файл с сервера на клиент и клиент на сервер.

Чтобы отправить файл с сервера на сервер, выполните следующие действия. Он отлично работает.

Если у вас есть какие-либо вопросы, дайте мне знать.

Server Side Код:

public class ServerRecieveFile { 
public static void main(String[] args) throws IOException {// TODO Auto-enerated method stub int filesize=1022386; 
int bytesRead; int currentTot= ; 
ServerSocket serverSocket=new ServerSocket(15123); 
Socket socket=rverSocket.accept(); 
byte [] bytearray = new byte [filesize]; 
InputStream is=socket.getInputStream(); 
File copyFileName=new File("c:/Files Sockets/2.txt"); 
FileOutputStream fos = new FileOutputStream(copyFileName); 
BufferedOutputStream bos = new BufferedOutputStream(fos); 
bytesRead = is.read(bytearray,0,bytearray.length); 
currentTot = bytesRead; 
do { 
bytesRead =is.read(bytearray, currentTot, (bytearray.length-currentTot)); if(bytesRead >= 0) 
currentTot += bytesRead; 
} while(bytesRead > -1); 
bos.write(bytearray, 0 , currentTot); 
bos.flush(); 
bos.close(); 
socket.close(); 
} 
} 

стороны клиента код:

public class ClientSendFile { 
public static void main(String[] args) throws UnknownHostException, IOException {// TODO Auto-generated method stub 
Client client=new Client(); 
Socket socket = new Socket(InetAddress.getLocalHost(),15123); 
System.out.println("Accepted connection : " + socket); 
File transferFile = new File ("c:/Files Sockets/1.txt"); 
byte [] bytearray = new byte (int)transferFile.length()]; 
FileInputStream fin = new FileInputStream(transferFile); 
BufferedInputStream bin = new BufferedInputStream(fin); 
bin.read(bytearray,0,bytearray.length); 
OutputStream os = socket.getOutputStream(); 
System.out.println("Sending Files..."); 
os.write(bytearray,0,bytearray.length); 
os.flush(); 
socket.close(); 
System.out.println("File transfer complete"); 
} 
} 
+0

To Shanahul: Первоначальный вопрос заключался в том, чтобы просить передачу файла client-> server-> client, и, предположительно, без временного хранения на стороне сервера – Saint