编译Java Networking App时出错

时间:2017-04-28 15:16:48

标签: java networking network-programming

所以我正在为一个课程项目做这个应用程序,当我尝试与服务器通信时,我收到此错误:

java.io.StreamCorruptedException: invalid stream header: 43686F6F
at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:806)
at java.io.ObjectInputStream.<init>(ObjectInputStream.java:299)
at Client.ChatClient.<init>(ChatClient.java:31)
at Client.ChatClient.main(ChatClient.java:102)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)

这是我的服务器代码:

public class ChatServer implements Observer {

private ServerSocket serverSocket = null;
private ArrayList<ClientHandler> clients = null;
private Executor service = Executors.newFixedThreadPool(10);


public ChatServer( int port ) {
    try {
        serverSocket = new ServerSocket( port );
    }
    catch (IOException e) {
        e.printStackTrace();
    }
    clients = new ArrayList<ClientHandler>();
    Thread t = new Thread( new ServerLoop() );
    t.start();
}

public void tellEveryone( String message ) {
    Iterator it = clients.iterator();
    while ( it.hasNext() ) {
        System.out.println( 1 );
        ClientHandler client = (ClientHandler) it.next();
        client.send(message);
    }
    System.out.println( message );
}

@Override
public void update(Observable o, Object arg) {
    System.out.println("from server - updateMethod : " + arg );
}

public class ServerLoop implements Runnable {
    public void run() {
        try {
            while (true) {
                Socket clientSocket = serverSocket.accept();


                ClientHandler c = new ClientHandler(clientSocket);
                clients.add(c);
                c.addObserver(ChatServer.this);

                service.execute(c);

                tellEveryone("new client");

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



public static void main( String[] args ) {
    ChatServer s = new ChatServer( 5000 );

}

}

这是我的客户端处理程序(主要部分):

public class ClientHandler extends Observable implements Runnable {

private Scanner reader = null;
private PrintWriter writer = null;
private String path = "../";
private Socket client;
private BufferedOutputStream bufferedOutputStream;
private boolean isConnected = false;
private ObjectOutputStream outputStream = null;
private String sourceDirectory = "/home/csunix/sc16hsm/IdeaProjects/ServerClient/src/Server/folder1";
private String destinationDirectory = "/home/csunix/sc16hsm/IdeaProjects/ServerClient/src/Client/Downloads/";
private int fileCount = 0;
private FileEvent fileEvent = null;

public ClientHandler( Socket client ) {
    try {
        this.client=client;
        reader = new Scanner( client.getInputStream() );
        writer = new PrintWriter( client.getOutputStream(), true );
        bufferedOutputStream = new BufferedOutputStream(client.getOutputStream());
    }
    catch (IOException e) { 
        e.printStackTrace(); 
    }
}

public void locateFiles() {
    File srcDir = new File(sourceDirectory);
    if (!srcDir.isDirectory()) {
        System.out.println("Source directory is not valid ..Exiting the client");
        System.exit(0);
    }
    File[] files = srcDir.listFiles();
    fileCount = files.length;
    if (fileCount == 0) {
        System.out.println("Empty directory ..Exiting the client");
        System.exit(0);
    }

    for (int i = 0; i < fileCount; i++) {
        System.out.println("Sending " + files[i].getAbsolutePath());
        sendFile(files[i].getAbsolutePath(), fileCount - i - 1);
        System.out.println(files[i].getAbsolutePath());
    }
}

public void sendFile(String fileName, int index) {
    fileEvent = new FileEvent();
    fileEvent.setDestinationDirectory(destinationDirectory);
    fileEvent.setSourceDirectory(sourceDirectory);
    File file = new File(fileName);
    fileEvent.setFilename(file.getName());
    fileEvent.setRemainder(index);
    DataInputStream diStream = null;
    try {
        diStream = new DataInputStream(new FileInputStream(file));
        long len = (int) file.length();
        byte[] fileBytes = new byte[(int) len];
        int read = 0; int numRead = 0;
        while (read < fileBytes.length && (numRead = diStream.read(fileBytes, read, fileBytes.length - read)) >= 0) {
            read = read + numRead;
        }
        fileEvent.setFileData(fileBytes);
        fileEvent.setStatus("Success");
    } catch (Exception e) {
        e.printStackTrace();
        fileEvent.setStatus("Error");

    }

    try {
        outputStream.writeObject(fileEvent);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

public void listFolders(){
    File file = new File("../");
    String[] directories = file.list(new FilenameFilter() {
        @Override
        public boolean accept(File current, String name) {
            return new File(current, name).isDirectory();
        }
    });
    send(Arrays.toString(directories));
}

public void listAll(String fileName){
    File folder = new File(path + "/" + fileName);
    path = folder.getPath();
    System.out.println(path);
    File[] listOfFiles = folder.listFiles();
    for (int i = 0; i < listOfFiles.length; i++) {
        if (listOfFiles[i].isFile()) {
            writer.println("File: " + listOfFiles[i].getName());
        } else if (listOfFiles[i].isDirectory()) {
            writer.println("Directory: " + listOfFiles[i].getName());
        }
    }
}

public void send( String message ) {
    writer.println( message );
}


public void run() {
    String message;
    writer.println("Choose a file");


    listAll("");
    while ((message = reader.nextLine()) != null) {

        writer.println("Choose a file");
        listAll(message);
        setChanged();
        notifyObservers( message );


        if(message.equals("download")) {
            System.out.println("MESSAGE FROM CLIENT: " + message);
            writer.println("ready");
            locateFiles();

        }
    }
}
}

这是我的客户代码:

public class ChatClient {

private Scanner socketIn = null;
private PrintWriter socketOut = null;
private Scanner keyboardIn = null;
private Socket socket = null;
private ObjectInputStream inputStream = null;
private FileEvent fileEvent;
private File dstFile = null;
private FileOutputStream fileOutputStream = null;

public ChatClient( String host, int port ) {

    try {        
        Socket socket = new Socket( host, port );
        socketIn = new Scanner( socket.getInputStream() );
        socketOut = new PrintWriter( socket.getOutputStream(), true );
        keyboardIn = new Scanner( System.in );
        inputStream = new ObjectInputStream(socket.getInputStream());
    }
    catch( IOException e ) {
        e.printStackTrace();
    }
}

public void downloadFiles() {
    while (socket.isConnected()) {
        try {
            fileEvent = (FileEvent) inputStream.readObject();
            if (fileEvent.getStatus().equalsIgnoreCase("Error")) {
                System.out.println("Error occurred ..with file" + fileEvent.getFilename() + "at sending end ..");

            }
            String outputFile = fileEvent.getDestinationDirectory() + fileEvent.getFilename();
            if (!new File(fileEvent.getDestinationDirectory()).exists()) {
                new File(fileEvent.getDestinationDirectory()).mkdirs();
            }
            dstFile = new File(outputFile);
            fileOutputStream = new FileOutputStream(dstFile);
            fileOutputStream.write(fileEvent.getFileData());
            fileOutputStream.flush();
            fileOutputStream.close();
            System.out.println("Output file : " + outputFile + " is successfully saved ");
            if (fileEvent.getRemainder() == 0) {
                System.out.println("Whole directory is copied...So system is going to exit");
                System.exit(0);
            }

        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}

private void talktoServer() {

    String message;


    Thread readerThread = new Thread( new IncomingReader() );
    readerThread.start();


    while ((message = keyboardIn.nextLine()) != null) {
        System.out.println("client typed: " + message);
        socketOut.println( message );

    }
}


private class IncomingReader implements Runnable {

    public void run() {
        String message;
        while ((message = socketIn.nextLine()) != null) {
            System.out.println("client read: " + message);

            if(message.equals("ready")) {
                downloadFiles();
            }
        }
    }
}


public static void main( String[] args ) {
    ChatClient c = new ChatClient( "127.0.0.1", 5000 );
    c.talktoServer();
}
}

任何帮助都将非常感谢!

0 个答案:

没有答案