简体   繁体   English

读取流套接字服务器

[英]reading stream socket server

since im spliting the string to the client menu, my programs turns to bug because the swicth doesnt do anything on the client and since it doesnt do anything it doesnt start any method, and thats why when server gets the output and start the download file, when it starts writing the client doesnt acept it, because his menu didnt started the receive function, any tip to make the switch and the server work and synchronized methods? 由于将字符串拆分到客户端菜单后,我的程序出现错误,因为swicth在客户端上不执行任何操作,并且由于它不执行任何操作而不会启动任何方法,因此这就是服务器获取输出并启动下载文件的原因,当它开始写时,客户端不接受它,因为他的菜单没有启动接收功能,是否有使开关和服务器工作以及同步方法的提示? client realices send file while server does upload, and client realices receivefile when server does download all cuz of the input to the cli 服务器上载时,客户端房地产发送文件,服务器上载所有的cuz客户端存储时,客户端房地产接收文件

this is my conexion Server 这是我的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!");
           }    
    }
}

this is my client class 这是我的客户班

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();
    }
}
}

and this is my server 这是我的服务器

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();    }
    }
}
}

and this is my error 这是我的错误

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)

Closing the input or output stream of a socket closes the other stream and the socket, and you are doing this at several points. 关闭套接字的输入或输出流会同时关闭另一个流和套接字,您需要在多个地方执行此操作。

However there are numerous other problems with this code. 但是,此代码还有许多其他问题。

  1. You describe it as an FTP server but you are using Java Serialization, which is a different protocol. 您将其描述为FTP服务器,但使用的是Java序列化,这是一个不同的协议。 It is not an FTP server. 不是 FTP服务器。
  2. You are creating new object streams every time you go to read the next message, instead of retaining them for the life of the socket. 每次去阅读下一条消息时,您都在创建新的对象流,而不是在套接字的整个生命周期中都保留它们。 This will cause this problem or one like it. 这将导致此问题或类似的问题。
  3. You are mixing ObjectInputStream and DataInputStream on the same socket. 您在同一套接字上混合ObjectInputStreamDataInputStream This will not work. 这是行不通的。
  4. You are ignoring the boolean returned by File.delete() , and you are catching a non-existent Exception that cannot be thrown, short of an NPE or other programming bug, in the same method. 您将忽略File.delete()返回的boolean ,并且将捕获一个不存在的,无法通过相同方法抛出的异常(缺少NPE或其他编程错误)的Exception
  5. You are catching, logging, and otherwise ignoring exceptions when they should be reported to the peer. 您正在捕获,记录日志,或者在应将异常报告给对等方时忽略异常。
  6. You are assuming that a file size fits into an int. 您假设文件大小适合int。
  7. You are assuming that a file to be downloaded fits into memory, and needlessly doing so when you could just as well copy a small buffer at a time, say 8192 bytes. 您假设要下载的文件适合内存,并且一次可以复制一个小的缓冲区(例如8192字节)时,则不必这样做。
  8. Your receiveFile() method can over-run the received data. 您的receiveFile()方法可能会使接收到​​的数据溢出。 For a correct way to transfer multiple files, or even one file while keeping the connection open, see this answer . 有关在保持连接打开的情况下传输多个文件甚至一个文件的正确方法,请参见此答案

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM