java - socket编程java丢包

标签 java sockets

我正在尝试从客户端向服务器发送文件。下面是我试过的代码。但有时,在传输过程中会丢失数据包。我不确定我哪里错了。

服务器端代码:

public static void ReadAndWrite(byte[] aByte, Socket clientSocket,
            InputStream inputStream, String fileOutput)
                    throws FileNotFoundException, IOException {
        int bytesRead;
        FileOutputStream fileOutputStream = null;
        BufferedOutputStream bufferedOutputStream = null;
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        try
        {
        fileOutputStream = new FileOutputStream( fileOutput );
        bufferedOutputStream = new BufferedOutputStream(fileOutputStream);
        bytesRead = inputStream.read(aByte, 0, aByte.length);
        System.out.println("The length is "+bytesRead);
        int count = 0;
        do {
            count++;
            byteArrayOutputStream.write(aByte);
            bytesRead = inputStream.read(aByte);
        } while (bytesRead != -1);
        System.out.println("The count is "+count);
        System.out.println("The length is "+byteArrayOutputStream.size());
        bufferedOutputStream.write(byteArrayOutputStream.toByteArray());
        bufferedOutputStream.flush();
        bufferedOutputStream.close();
        clientSocket.close();
        }
        catch(Exception ex)
        {
            Logger.writeLog(ex,Listen.class.getName(), LogType.EXCEPTION);  
            throw ex;
        }

客户端代码:

public  void readByteArrayAndWriteToClientSocket(
            Socket connectionSocket, BufferedOutputStream outToClient, String fileToSend ) throws Exception
    {
        try{
        if (outToClient != null) 
        {
            File myFile = new File(fileToSend);
            System.out.println(myFile.length());
            byte[] byteArray = new byte[(int) myFile.length()];

            FileInputStream fileInputStream = null;

            try {
                fileInputStream = new FileInputStream(myFile);
            } catch (IOException ex) {
                Logger.writeLog(ex, FileUtility.class.getName(), LogType.EXCEPTION);
                throw ex;
            }
            BufferedInputStream bufferedInputStream = new BufferedInputStream(fileInputStream);

            try {
                bufferedInputStream.read(byteArray, 0, byteArray.length);
                outToClient.write(byteArray, 0, byteArray.length);
                outToClient.flush();
                outToClient.close();
                connectionSocket.close();


                return;
            } catch (IOException ex) {
                Logger.writeLog(ex, FileUtility.class.getName(), LogType.EXCEPTION);
                throw ex;
            }

        }
        }catch (Exception e) {
            Logger.writeLog(e, getClass().getName(), LogType.EXCEPTION);
            throw e;
        }
    }

最佳答案

没有“数据包丢失”,只是代码中的错误。

在 Java 中复制流的规范方法如下:

while ((count = in.read(buffer)) > 0)
{
   out.write(buffer, 0, count);
}

如果事先知道字节数,发送方必须在传输后保持连接打开,则变为:

while (total < expected && (count = in.read(buffer, 0, expected-total > buffer.length ? buffer.length : (int)(expected-total))) > 0)
{
   out.write(buffer, 0, count);
   total += count;
}

忘记所有的 ByteArrayInput/OutputStreams 和额外的副本。只需从文件读取并发送到套接字,或从套接字读取并写入文件。

关于java - socket编程java丢包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20649811/

相关文章:

java - 持久性模型与 View 模型

java - Wicket - 如何使用 ListView 项目调用另一个页面

java - 如何将 Java 资源作为文件获取?

xcode - 沙箱无法访问本地套接字

sockets - 以独立于浏览器的方式查看用户正在访问哪个网站

java - 通过代码运行jar - Java

Java - 正则表达式匹配字符串中的连续数字或字符

java - 多平台Base64编解码问题(Android to PC)

sockets - 即使连接已关闭,如何修复 'too many close_wait connections are created'?

c - read在socket编程中的用法