簡體   English   中英

套接字編程Java中的數據包丟失

[英]Packet loss in socket programming java

我正在嘗試從客戶端向服務器發送文件。 以下是我嘗試過的代碼。 但有時,在傳輸過程中會丟包。 我不確定我哪里錯了。

服務器端代碼:

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和多余的副本。 只需從文件中讀取並發送到套接字,或從套接字中讀取並寫入文件即可。

套接字讀取方法在獲得了您要求的所有字節后將返回,或者在停止從網絡接收數據時返回。

由於在任何實際網絡中傳輸經常被中斷,因此您需要繼續發出讀取呼叫,直到擁有所需的字節數為止。

您需要這樣的代碼:

        char [] buffer = new char[1024];
        int expect = 1000;
        int sofar = 0;
       int chars_read;
       try
       {
          while((chars_read = from_server.read(buffer[sofar])) != -1)
          {
             sofar = sofar + chars_read;
             if (sofar >= expected) break;
          }
       }
       catch(IOException e)
       {
          to_user.println(e);
       }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM