Java чат с передачей файлов - PullRequest
       72

Java чат с передачей файлов

0 голосов
/ 05 августа 2020

Я только начал изучать программирование и хотел создать чат в java, куда вы можете отправлять файлы и т.д. c. Когда я попытался создать передачу файлов, я получил эту ошибку

java.net.SocketException: Socket closed
    at java.net.SocketInputStream.socketRead0(Native Method)
    at java.net.SocketInputStream.socketRead(SocketInputStream.java:116)
    at java.net.SocketInputStream.read(SocketInputStream.java:170)
    at java.net.SocketInputStream.read(SocketInputStream.java:141)
    at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:284)
    at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:326)
    at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178)
    at java.io.InputStreamReader.read(InputStreamReader.java:184)
    at java.io.BufferedReader.fill(BufferedReader.java:161)
    at java.io.BufferedReader.readLine(BufferedReader.java:324)
    at java.io.BufferedReader.readLine(BufferedReader.java:389)
    at lab03.ReadThread.run(ReadThread.java:26)
BUILD STOPPED (total time: 16 seconds)

вот мой код клиента:

 Thread socketReader = new ReadThread(socket);
        socketReader.start();
        Scanner scanner = new Scanner(System.in);
        boolean files =false;
        String s="";
        while(true){
            
            if(files)
            {
                
               File file = new File("C:\\Users\\Kostar\\Desktop\\asd.txt");
               long length = file.length();
                byte[] bytes = new byte[16 * 1024];
                InputStream in2 = new FileInputStream(file);
                OutputStream out2 = socket.getOutputStream();
                        int count;
                        while ((count = in2.read(bytes)) > 0) {
                            out2.write(bytes, 0, count);
                        }

            out2.close();
            in2.close();
                
                files=false;
            }
            else
            {
                s=scanner.nextLine();
                if(s.startsWith("/sf"))
                    {
                        
                        files=true;
                        out.println(s);
                    }
                else
                    out.println(s);
            }

          
        }
        
    
     
    }catch(Exception ex){ex.printStackTrace();}

И ReadThread:

    public ReadThread(Socket socket) throws IOException{
    this.socket = socket;
    this.in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
    this.out = new PrintStream(socket.getOutputStream());
}
String s="";
public void run() {
    try{

        while(true){
            s=in.readLine();
            System.out.println(s);
        }

    }catch(Exception ex){   ex.printStackTrace();
    }finally{
        Close();
    }
}

public void Close(){
    try{
        in.close();
        out.close();
        socket.close();  
    }catch(Exception ex){   ex.printStackTrace();}
}

В основном После этого создается файл, и в нем есть все, что должно быть, но, как вы можете видеть, клиент отключается, а сервер получает NULL. Может кто-нибудь помочь мне? Я знаю, что вставка стены кода не очень полезна / приятна, но я думаю, что мне пришлось

1 Ответ

0 голосов
/ 05 августа 2020

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

- Edit -

Извинения. Приведенный выше совет подходит для чтения файлов, но не для чтения сокетов. Для сокетов вы должны специально перехватить SocketException. SocketException - ваш друг - вы получаете уведомление о том, что сокет закрыт, и освобождает поток, ожидающий входящего потока. Ниже приведены инструкции по обращению.

public void run() {
    try{

        while(true){
            s=in.readLine();
            System.out.println(s);
        }

    } catch (SocketException se) {
      //potentially add a logging message that socket (socketnumber) has closed
      //socket is closed. You can exit out of the read loop
      return;
    } catch(IOException ex){   ex.printStackTrace();
    }finally{
        Close();
    }
}
...