簡體   English   中英

讀取流套接字服務器

[英]reading stream socket server

由於將字符串拆分到客戶端菜單后,我的程序出現錯誤,因為swicth在客戶端上不執行任何操作,並且由於它不執行任何操作而不會啟動任何方法,因此這就是服務器獲取輸出並啟動下載文件的原因,當它開始寫時,客戶端不接受它,因為他的菜單沒有啟動接收功能,是否有使開關和服務器工作以及同步方法的提示? 服務器上載時,客戶端房地產發送文件,服務器上載所有的cuz客戶端存儲時,客戶端房地產接收文件

這是我的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)

關閉套接字的輸入或輸出流會同時關閉另一個流和套接字,您需要在多個地方執行此操作。

但是,此代碼還有許多其他問題。

  1. 您將其描述為FTP服務器,但使用的是Java序列化,這是一個不同的協議。 不是 FTP服務器。
  2. 每次去閱讀下一條消息時,您都在創建新的對象流,而不是在套接字的整個生命周期中都保留它們。 這將導致此問題或類似的問題。
  3. 您在同一套接字上混合ObjectInputStreamDataInputStream 這是行不通的。
  4. 您將忽略File.delete()返回的boolean ,並且將捕獲一個不存在的,無法通過相同方法拋出的異常(缺少NPE或其他編程錯誤)的Exception
  5. 您正在捕獲,記錄日志,或者在應將異常報告給對等方時忽略異常。
  6. 您假設文件大小適合int。
  7. 您假設要下載的文件適合內存,並且一次可以復制一個小的緩沖區(例如8192字節)時,則不必這樣做。
  8. 您的receiveFile()方法可能會使接收到​​的數據溢出。 有關在保持連接打開的情況下傳輸多個文件甚至一個文件的正確方法,請參見此答案

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM