System.out.println更正了网络异常,但我不想使用它

时间:2012-11-03 22:22:23

标签: java exception network-programming

这是我的第一个问题。我搜索了几个小时来帮助自己,但互联网上没有解决方案。 我的程序只会在我插入“System.out.println()”时运行,我想通过使用tcp传输一个大文件(mp3,5Mb)。我在使用java方面有很大的兴趣,但这是一个非常有趣的失败。

服务器和客户端位于128.0.0.1

这是我的客户端代码

public void receive(int port) {
        try {
            ServerSocket s = new ServerSocket(port);
            Socket socket = s.accept();
            BufferedInputStream in = new BufferedInputStream(
                    socket.getInputStream());
            FileOutputStream fileOut = new FileOutputStream("dateiname.mp3");

            startzeit = Calendar.getInstance().getTimeInMillis();

            byte[] b = new byte[32];
            while (in.available() > 0) {
                System.out.println(Calendar.getInstance().getTimeInMillis()
                        - startzeit);
                in.read(b);
                fileOut.write(b);
                fileOut.flush();
                received += 1;
            }
            System.out.println("Feritg");
            fileOut.close();
        } catch (SocketException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

服务器

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.InetAddress;
import java.net.Socket;

public class FileTransfer {
    @SuppressWarnings("resource")
    public static void send(File datei, InetAddress ip, int port)
            throws IOException 
        {
        Socket socket = new Socket(ip, port);
        BufferedOutputStream out = new BufferedOutputStream(socket.getOutputStream());
        FileInputStream fileIn = new FileInputStream(datei);
        while (fileIn.available() > 0) {
            byte[] b = new byte[32];
            fileIn.read(b);
            out.write(b);
            out.flush();
        }
        out.close();
        socket.close();
    }
}

至少是服务器所播放的异常

Exception in thread "main" java.net.SocketException: Connection reset by peer: socket write error
 at java.net.SocketOutputStream.socketWrite0(Native Method)
 at java.net.SocketOutputStream.socketWrite(Unknown Source)
 at java.net.SocketOutputStream.write(Unknown Source)
 at java.io.BufferedOutputStream.flushBuffer(Unknown Source)
 at java.io.BufferedOutputStream.flush(Unknown Source)
 at FileTransfer.send(FileTransfer.java:20)
 at MainServer.main(MainServer.java:12)

请帮帮我!

2 个答案:

答案 0 :(得分:2)

该异常意味着客户端意外关闭了套接字。

您可能不希望在while循环中使用available()进行检查。该函数仅指示可以不阻塞地读取的字节数,而不是文件中的总字节数。您想要的是服务器中的类似内容:

while (fileIn.read(b) != -1) { ...

客户端应该使用类似的代码。

另请注意,您的代码不会处理读取少于32个字节的情况。你应该这样做:

while ((n = fileIn.read(b))!= -1) {
  out.write(b, n);
  ...

最后,32字节的大小非常小,使用4KB,8KB甚至更大的缓冲区可以获得更快的传输速度。

答案 1 :(得分:1)

不要重新发明轮子。使用Apache Commons IO库中的IOUtils.copy(InputStream input, OutputStream output)