2017-04-25 89 views
0

由於即時消息拆分字符串到客戶端菜單,我的程序轉向bug,因爲swicth不做任何事情在客戶端上,因爲它沒有做任何事情,它沒有啓動任何方法,這就是爲什麼當服務器獲得輸出並開始下載文件,當它開始編寫客戶端犯規acept它,因爲他的菜單didnt開始接收功能,任何提示,使交換機和服務器的工作和同步方法?客戶realices而服務器也上傳發送文件,客戶端realices receivefile當服務器並下載 所有的Cuz輸入到CLI閱讀流套接字服務器

的,這是我conexion服務器

package eagz.org; 

import java.io.BufferedInputStream; 
import java.io.BufferedReader; 
import java.io.DataInputStream; 
import java.io.DataOutputStream; 
import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileOutputStream; 
import java.io.FileReader; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.io.ObjectInputStream; 
import java.io.ObjectOutputStream; 
import java.io.OutputStream; 
import java.net.ServerSocket; 
import java.net.Socket; 
import java.util.Scanner; 

public class ConexionServer1 extends Thread{ 
private static ServerSocket ss; 
private static Socket s = null; 
public static String path = "C:\\Users\\Eduardo\\Desktop\\Eduardo\\Uru\\Clases Programacion\\POO\\CLI\\server\\"; 
static Scanner input = new Scanner (System.in); 
private static BufferedReader in = null; 

    ConexionServer1(Socket s){ 
     this.s = s; } 

    public void run(){ 
     try{ 
      menu(); } //line 33 
     finally{ 
       try { 
        s.close(); 
       } catch (IOException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } } } 



    public static void menu() { 
     try { 
      while(true){ 
      ObjectOutputStream oos = new ObjectOutputStream(s.getOutputStream()); // line 47 
      ObjectInputStream ois = new ObjectInputStream(s.getInputStream()); 
      String msg = (String)ois.readObject(); 
      System.out.println(msg); 
      String[] cmds = msg.split(" "); 
     /* in = new BufferedReader(new InputStreamReader(
        s.getInputStream())); 
      String clientSelection = in.readLine(); 
      String[] cmds = clientSelection.split(" "); 
      String[] cmds = clientSelection.split("");*/  
      switch(cmds[0]){ 
      case "create": ; 
      File f = new File(cmds[1]); 
       if(!f.exists()){ 
        create(cmds[1]); 
        oos.writeObject(">> File Created"); } 
       else{ 
        create(cmds[1]); 
        oos.writeObject(">> File not created"); } 
       break; 

      case "delete": 
       File f1 = new File(cmds[1]); 
        delete(cmds[1]); 
        if(!f1.exists()){ 
         oos.writeObject(" File Deleted "); } 
        else{ 
         oos.writeObject(" File not found"); } 
       break; 

      case "download": 
       download(cmds[1]); 
       oos.writeObject("Sucess"); 
       break; 

      case "upload": 
       upload(cmds[1]); 
       oos.writeObject("Sucessfull"); 
       break; 

      default: 
       System.out.println("Undefined Operation"); 
       oos.writeObject("Undefined Operation"); 
       break; 
      }//case 
     oos.close(); 
     ois.close(); 
      }} 
     catch (IOException | ClassNotFoundException e) {  e.printStackTrace(); } 
    } 


    public static void create (String filename){ 
     File f = new File(path + filename); 
     try{if(!f.exists()){ 
      f.createNewFile(); 
      System.out.println(">> File Created");    
     } 
     else { 
      System.err.println(">> File Already Exists"); } 
     } 
     catch(Exception e){e.printStackTrace();} 
    }//create 


    public static void delete (String filename){ 
     File f = new File(path + filename); 
     try{if(f.exists()){ 
      f.delete(); 
      System.out.println(">>File Deleted"); } 
     else{ 
      System.err.println(">>Error, File doesnt exist's"); } 
     } 
     catch(Exception e){e.printStackTrace();} 
    } 

    public static void upload (String filename){ 
     File f = new File(path + filename); 
     try{ 
      DataInputStream clientData = new DataInputStream(s.getInputStream()); 
     // String fileName = clientData.readUTF(); 
      OutputStream os = new FileOutputStream(("received from client -> " + f)); 
      long size = clientData.readLong(); 
      byte[] buffer = new byte[1024]; 
      int i = clientData.read(buffer,0,(int) size); 
       while(size > 0 && (i) > 0){ 
        os.write(buffer, 0, i); 
        size -= i; 
       } 
      os.flush(); 
      clientData.close(); 

    System.out.println("File "+filename+" received from client."); 
    }  catch (IOException ex) { 
     System.err.println("Client error. Connection closed.");} 
} 



    public static void download (String filename){ 
     try { 
       File myFile = new File(path + filename); 
       byte[] mybytearray = new byte[(int) myFile.length()]; 
       FileInputStream fis = new FileInputStream(myFile); 
       BufferedInputStream bis = new BufferedInputStream(fis); 
       DataInputStream dis = new DataInputStream(bis); 
       dis.readFully(mybytearray, 0, mybytearray.length); 
       OutputStream os = s.getOutputStream(); 
       DataOutputStream dos = new DataOutputStream(os); 
       dos.writeUTF(myFile.getName()); 
       dos.writeLong(mybytearray.length); 
       dos.write(mybytearray, 0, mybytearray.length); 
       dos.flush(); 
       System.out.println("File "+ filename +" sent to client."); 
      } catch (Exception e) { 
       System.err.println("File does not exist!"); 
      }  
    } 
} 

,這是我的客戶端類

package eagz.org; 


public class Cliente { 
public static String path = "C:\\Users\\Eduardo\\Desktop\\Eduardo\\Uru\\Clases Programacion\\POO\\CLI\\cliente"; 
private static Socket s; 
private static String fileName; 
private static BufferedReader stdin; 
private static PrintStream os; 
static int PORT = 9000; 
static String IP = "localhost"; //use your ip 
static Scanner input = new Scanner (System.in); 

public static void main(String[] args) throws IOException { 
    try { 
     s = new Socket(IP ,PORT); 
     stdin = new BufferedReader(new InputStreamReader(System.in)); 

     System.err.println("-- Client --"); 
     System.out.println("Connecting to Server ->" + IP + "/" + PORT); 
     System.out.println("Commands: "+" -> Create "+" -> Delete "+" -> Download "+" -> Upload"); 
     System.out.println("C:>"); 

     String inp = input.nextLine(); 
     String [] cmds = inp.split(""); 

     ObjectOutputStream oos = new ObjectOutputStream(s.getOutputStream()); 
     oos.writeObject(inp); 

     ObjectInputStream ois = new ObjectInputStream(s.getInputStream()); 
    // System.out.println("From Server : " + servermsg); 

      switch (cmds[0]) { 
        case "upload": 
      // os.println(cmds); 
         //oos.writeObject(inp); 
         sendFile(cmds[1]); 

         break; 
        case "download": 
         //System.err.print("Enter file name: "); 
         fileName = cmds[1]; 
         oos.writeObject(cmds[0] + fileName); 
         receiveFile(fileName); 
         break; 
       } 
      //String servermsg = (String) ois.readObject(); 
      System.out.println("From Server : "); 
     } catch (Exception e) { 
      e.printStackTrace(); 
    } 
} 


public synchronized static void sendFile(String fileName) { 
    try { 
     File myFile = new File(path + fileName); 
     byte[] mybytearray = new byte[(int) myFile.length()]; 
     FileInputStream fis = new FileInputStream(myFile); 
     BufferedInputStream bis = new BufferedInputStream(fis); 
     DataInputStream dis = new DataInputStream(bis); 
     dis.readFully(mybytearray, 0, mybytearray.length); 
     OutputStream os = s.getOutputStream(); 
     DataOutputStream dos = new DataOutputStream(os); 
     dos.writeUTF(myFile.getName()); 
     dos.writeLong(mybytearray.length); 
     dos.write(mybytearray, 0, mybytearray.length); 
     dos.flush(); 
     System.out.println("File "+fileName+" sent to Server."); 
    } catch (Exception e) { 
     System.err.println("File does not exist!"); 
    } 
} 

public synchronized static void receiveFile(String fileName) { 
    try { 
     File f = new File(path + fileName); 
     InputStream is = s.getInputStream(); 
     DataInputStream clientData = new DataInputStream(is); 
     fileName = clientData.readUTF(); 
     OutputStream os = new FileOutputStream(("received from server -> " + f)); 
     long size = clientData.readLong(); 
     byte[] buffer = new byte[1024]; 

     int i = clientData.read(buffer,0,(int) size); 
      while (size > 0 && (i) != -1) { 
       os.write(buffer, 0, i); 
       size -= i; 
      } 
     os.close(); 
     clientData.close(); 
     System.out.println("File "+fileName+" received from Server."); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 
} 

,這是我的服務器

package eagz.org; 


public class Server extends Thread { 
public static final int PORT = 9000; 
public static ServerSocket ss = null; 
public static Socket s = null; 

public static void main(String[] args) { 
    try { 
     ss = new ServerSocket(PORT); 
     System.err.println("- - Server - -"); 
     while(true){ 
      s = ss.accept(); 
      System.out.println("- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -"); 
      System.out.println("NEW CONNECTION WORKING ON ADDRESS -> " + s.getInetAddress().getHostName()); 
      Thread conect = new ConexionServer1(s); 
      conect.start(); 
     } 
    } catch (IOException e) { 
     System.err.println("Port already in use."); 
     e.printStackTrace();} 

    finally{ 
     try { 
      s.close(); 
      ss.close(); 
     } catch (Exception e) { e.printStackTrace(); } 
    } 
} 
} 

,這是我的錯誤

NEW CONNECTION WORKING ON ADDRESS -> Eduardo 
download cesar.txt 
java.net.SocketException: Socket is closed 
File cesar.txt sent to client. 
at java.net.Socket.getOutputStream(Socket.java:943) 
at eagz.org.ConexionServer1.menu(ConexionServer1.java:47) 
at eagz.org.ConexionServer1.run(ConexionServer1.java:33) 

回答

2

關閉套接字的輸入或輸出流關閉其他流和插座,和你在幾個點做這個。

但是這個代碼還有很多其他的問題。

  1. 您將其描述爲FTP服務器,但您使用的是Java序列化,這是一種不同的協議。這是 FTP服務器。
  2. 您每次讀取下一條消息時都會創建新的對象流,而不是將它們保留在套接字的生命週期中。這將導致this problem或一個喜歡它。
  3. 您在同一個套接字上混合使用ObjectInputStreamDataInputStream。這不起作用。
  4. 您忽略了File.delete()返回的boolean,並且您正在捕獲不存在的Exception,在相同的方法中無法拋出NPE或其他編程錯誤。
  5. 您正在迎頭趕上,日誌記錄,否則忽略異常時,應通報給同行。
  6. 你假設的文件大小適合一個int。
  7. 假設一個要下載的文件適合內存,並且不必要地這樣做,當你可以同時複製一個小緩衝區,比如8192字節。
  8. 您的receiveFile()方法可以超出接收的數據。有關在保持連接打開的情況下傳輸多個文件或甚至一個文件的正確方法,請參閱this answer