Как решить Поток Закрыто Ошибка в Java? - PullRequest
1 голос
/ 20 января 2009

Я очень благодарен всем, кто прочитал бы это и попытался помочь мне, вот код, который я пытаюсь написать для серверного класса для проекта сокет-программирования для колледжа:

import java.io.*;
import java.net.*;
import java.io.File;

class Server{
    public static void main (String[]args)throws IOException{
        ServerSocket socket1 = new ServerSocket (8000);
        while (true) {
            Socket incoming = socket1.accept();
            new newclass(incoming).start();
        }
    }
}

class newclass extends Thread implements Runnable {

    Socket incoming;

    public newclass(Socket incoming) {
        this.incoming = incoming;
    }

    public void run() {
        try {
            byte x = 0;
            String z;
            String s = "HTTP 1.0 200 Document follows";
            String s1 = "Bad request message";
            BufferedReader input = new BufferedReader(new InputStreamReader(incoming.getInputStream()));
            PrintWriter output = new PrintWriter(incoming.getOutputStream(), true);
            DataOutputStream sending = new DataOutputStream(incoming.getOutputStream());
            File directory = new File("C:\\Documents and Settings\\Ahmed\\Desktop\\bla\\Server");
            File[] files = directory.listFiles();
            int x1 = files.length;
            if ((x1 - 3) < 10) {
                boolean done = false;
                while (!done) {
                    String line = input.readLine();
                    System.out.println(line);
                    if (line.equals("BYE")) {
                        output.println("BYE");
                        done = true;
                    } else {
                        if (line.trim().substring(0, 3).equals("GET ")) {
                            if (line.equals("<javalogo.png> HTTP    1.0")) {
                                File f = new File("javalogo.png");
                                int size = (int) f.length();
                                if (f.exists() == true) {
                                    output.println(s);
                                    output.println(size);
                                    output.println("javalogo1.png");
                                    DataInputStream bytefile = new DataInputStream(new BufferedInputStream(new FileInputStream(f)));
                                    while (bytefile.available() != 0) {
                                        x = bytefile.readByte();
                                        sending.write(x);
                                    }
                                } else {
                                    System.out.println("Getting file from main server");
                                    Socket socket2 = new Socket("127.0.0.1", 8100);
                                    BufferedReader bUsr = new BufferedReader(new InputStreamReader(System.in));
                                    PrintWriter pOut = new PrintWriter(socket2.getOutputStream(), true);
                                    BufferedReader bIn = new BufferedReader(new InputStreamReader(socket2.getInputStream()));
                                    pOut.println("GET <javalogo.png> HTTP 1.0");
                                    String rep = bIn.readLine();
                                    if (rep.equals("HTTP 1.0 200 Document follows")) {
                                        int len = Integer.parseInt(bIn.readLine());
                                        String fname = bIn.readLine();
                                        File f1 = new File(fname);
                                        f1.createNewFile();
                                        FileOutputStream fos = new FileOutputStream(f1);
                                        DataInputStream dis = new DataInputStream(socket2.getInputStream());
                                        for (int i = 0; i < len; i++) {
                                            fos.write(dis.read());
                                        }
                                        fos.close();
                                    } else if (rep.equals("File does not exist")) {
                                        output.println("Sorry, but the file was neither found in the proxy server or the main server or the name is wrong.");
                                    }

                                }
                            }
                            File f2 = new File("javalogo.png");
                            if (f2.exists() == true) {
                                int size = (int) f2.length();
                                output.println(s);
                                output.println(size);
                                output.println("javalogo.png");
                                DataInputStream bytefile = new DataInputStream(new BufferedInputStream(new FileInputStream(f2)));
                                while (bytefile.available() != 0) {
                                    x = bytefile.readByte();
                                    sending.write(x);
                                }
                            }
                        } else {
                            System.out.println(s1);
                            output.println(s1);
                        }
                    }
                }
                incoming.close();

            }
            output.println("Connecting to main server");
        } catch (Exception ex) {
            System.out.println(ex.getMessage());
        }
    }
}

Теперь я не понимаю, почему я получаю сообщение об ошибке при запуске на нем следующего клиента.
Я получаю эту действительно странную ошибку, когда буферизованный читатель правильно читает первую строку от пользователя, но со второй она дает мне нулевое исключение, как если бы клиент написал ноль или что-то еще, я не понимаю.

Вот код клиента в любом случае, если кто-нибудь может мне помочь, я был бы очень благодарен.

import java.net.*;
import java.io.*;


public class Client {

    public static void main(String[] args) throws Exception {

        Socket socket1 = new Socket("127.0.0.1", 8000);

        BufferedReader bUsr = new BufferedReader(new InputStreamReader(System.in));
        PrintWriter pOut = new PrintWriter(socket1.getOutputStream(), true);
        BufferedReader bIn = new BufferedReader(new InputStreamReader(socket1.getInputStream()));
        String cmd;
        String rep;
        while (true) {
            cmd = bUsr.readLine();
            pOut.println(cmd);

            System.out.println(rep = bIn.readLine());

            if (cmd.equals("BYE") || cmd.equals("END"))
                break;
            else if (rep.equals("HTTP 1.0 200 Document follows")) {
                int len = Integer.parseInt(bIn.readLine());
                String fname = bIn.readLine();
                File f = new File(fname);
                f.createNewFile();
                FileOutputStream fos = new FileOutputStream(f);
                DataInputStream dis = new DataInputStream(socket1.getInputStream());
                for (int i = 0; i < len; i++) {
                    fos.write(dis.read());
                }

                fos.close();
                System.out.println("Success");

            } else if (rep.equals("Connecting to main server")) {
                Socket socket1 = new Socket("127.0.0.1", 8100);
                BufferedReader bUsr = new BufferedReader(new InputStreamReader(System.in));
                PrintWriter pOut = new PrintWriter(socket1.getOutputStream(), true);
                BufferedReader bIn = new BufferedReader(new InputStreamReader(socket1.getInputStream()));
                String cmd;
                String rep;
                while (true) {
                    cmd = bUsr.readLine();
                    pOut.println(cmd);

                    System.out.println(rep = bIn.readLine());

                    if (cmd.equals("BYE") || cmd.equals("END"))
                        break;
                    else if (rep.equals("HTTP 1.0 200 Document follows")) {
                        int len = Integer.parseInt(bIn.readLine());
                        String fname = bIn.readLine();
                        File f = new File(fname);
                        f.createNewFile();
                        FileOutputStream fos = new FileOutputStream(f);
                        DataInputStream dis = new DataInputStream(socket1.getInputStream());
                        for (int i = 0; i < len; i++) {
                            fos.write(dis.read());
                        }

                        fos.close();
                        System.out.println("Success");
                    }
                }
            }

            bIn.close();
            pOut.close();
            socket1.close();
        }
    }

Это первый раз, когда я что-то спрашиваю на этом сайте, поэтому, если я что-то сделал не так, я буду более чем рад изменить то, что я написал.

Кстати, часть на сервере, которая заявляет «получение файла с главного сервера», является частью, где сам сервер становится клиентом для главного сервера, откуда он получает файл и отправляет его клиенту, я не добавлял основной код сервера, потому что он был бы слишком большим, но в основном он такой же, как сервер без условия if, ограничивающего его только 10 файлами в каталоге.

Ответы [ 5 ]

1 голос
/ 02 февраля 2009

В общем случае, когда есть исключение NullPointerException, либо:

  • Вы не создали экземпляр своего объекта
  • Ваш объект был уничтожен (закрыт) и поэтому не существует
  • У вас неверный актерский состав
  • Ваш код перезаписал указатель вашего объекта

Вам необходимо проверить дамп стека, чтобы увидеть, какой из них является истинным.

Из Jav Docs чтение может вызвать IOException, если возникает ошибка ввода-вывода и IOException может выдать вам указанное подробное сообщение. Строка сообщения об ошибке впоследствии может быть получена методом Throwable.getMessage () класса java.lang.Throwable.

Два очка:

  • Что дает деталь IOException?
  • Так как это для вашего курса в колледже, попробуйте обратиться за помощью к одноклассникам или TA
0 голосов
/ 15 сентября 2012

Лучший способ найти решение вашей ошибки - это увидеть след. Без этого я вижу более одной ошибки в вашем коде.

Привет.

0 голосов
/ 02 февраля 2009

Если вы получаете значение null из BufferedReader.readLine (), это означает, что вы достигли конца ввода, как указано в javadoc для этого метода.

0 голосов
/ 21 января 2009

Гм, я вижу ряд потенциальных ошибок и некоторых реальных ошибок в опубликованных классах, но код слишком сложен, чтобы я мог сосредоточиться на проблеме, которую вы видите. Если вы по-прежнему сталкиваетесь с сетевыми ошибками, попробуйте уменьшить код, а также клиент и сервер до минимума, чтобы установить связь (отправьте / прочитайте в одну строку). Если это не сработает для вас, опубликуйте эти классы, и мы сможем увидеть проблемы гораздо быстрее, чем при размещении здесь более крупных классов.

Удачи.

0 голосов
/ 20 января 2009

Я бы солгал, если бы сказал, что полностью понимаю, что делает ваш код - но если вы получаете нулевые данные, когда читаете из потока, который, как вы ожидаете, будет содержать данные, возможно, выходной поток не имеет «очистил» данные.

Убедитесь, что вы вызываете метод flush () в своих выходных потоках после записи в них

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...