首页 > 解决方案 > 传输文件的 Java 聊天

问题描述

我刚开始学习编程,我想在 java 中创建聊天,你可以在其中发送文件等。当我尝试创建文件传输时,我收到了这个错误

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。谁能帮我?我知道粘贴代码墙不是很有帮助/很好,但我想我必须这样做

标签: javafiletcpchat

解决方案


问题是您没有检查流的结尾。从套接字读取后,您应该检查您的字符串

- 编辑 -

道歉。上面的建议对于文件读取是正确的,但对于套接字读取是不正确的。对于套接字,您应该专门捕获 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();
    }
}

推荐阅读