2017-06-26 31 views
0

我遇到類似情況,我提供了一個由字符串組成的日誌文件。我需要做的是,我需要從文件中檢索每個字符串並通過一個Socket,當文件結束時它必須再次返回到文件的開頭並再次發送字符串。我用一個發送字符串的無限線程寫了一個簡單的代碼,當EOF到來時,我正在關閉文件,並使用新的BufferedReader對象再次打開文件。我也給了少量的5毫秒線程睡眠,但一段時間後,我的進程進入暫停狀態(如死鎖)。無論如何提高轉移的速度?否則我可以消除暫停狀態。如何在Java中以非常快的速度從文件中檢索數據

下面是我的簡單代碼:

public class Write extends Thread{ 

private static final String FileName = "Messages.txt"; 
private static final int port = 8080; 
private final int time = 5; 
ServerSocket serverSocket; 
Socket writeSocket; 

@Override 
    public void run() 
    { 
    try 
    { 
      serverSocket = new ServerSocket(port); 
      System.out.println("Server listening on port " + port+ " ..."); 
      Socket writeSocket = serverSocket.accept(); 
      System.out.println("Connected to Client : "+ writeSocket.getLocalSocketAddress()); 

      OutputStream outStream = writeSocket.getOutputStream(); 
      PrintWriter out = new PrintWriter(outStream, true); 
      BufferedReader input = new BufferedReader(new FileReader(FileName)); 
      String str = ""; 
      while(true) 
      { 
       str = input.readLine(); 

       if(str==null){ 
       input.close(); 
       input = new BufferedReader(new FileReader(FileName)); 
      } 

       else{ 
       System.out.println("Outgoing Message>>"+str); 
       out.println(str); 
       Thread.sleep(time); 
       } 
      } 

    } 
    catch(IOException e) {System.out.println(e); } catch (InterruptedException ex) { 
     Logger.getLogger(Write.class.getName()).log(Level.SEVERE, null, ex); 
    } 
    } 

} 

讓我給你一個簡單的解釋。考慮上面的代碼是在一個服務器代碼中。當我在同一臺PC上運行客戶端計算機時,我可以以某種(高)速度發送消息,但在某段時間後,客戶端和服務器都進入暫停狀態。我覺得這就像死鎖。客戶端顯示爲「服務器已斷開連接並再次連接」。當我關閉客戶端時,再次服務器啓動。誰能告訴我有沒有辦法以非常高的速度處理琴絃?

+1

那麼,如果你想走得快'Thread.sleep()'幾乎總是一個壞主意。 – markspace

+1

客戶端代碼在哪裏? – RealSkeptic

+0

對不起,我不能爲您提供客戶端代碼,因爲它是由其他人開發的,他們都提供了一個.exe文件。它是一個.Net客戶端,我的是一個Java服務器。 –

回答

0

重新程序阻塞,我建議:

  1. out.println()System.out.print("A")System.out.print("B")後。如果它用輸出中的最後一條消息「A」阻塞,那麼問題出現在客戶端(它們沒有使用數據,最終導致發送方阻塞)。
  2. 如果以前的情況發生,編寫你自己的簡單的客戶端,它只是從套接字讀取數據並拋出,所以你可以證明問題在另一端。

重新加速,想要刪除sleepSystem.out.println

0

你的代碼讀取日誌文件就好了。不需要加快速度。見下文(我評論的代碼與插座應對零件和代碼運行良好,在多次讀取日誌文件沒有放緩的跡象或死鎖。):

import java.io.BufferedReader; 
import java.io.FileReader; 
import java.io.IOException; 
import java.net.ServerSocket; 
import java.net.Socket; 
import java.util.logging.Level; 
import java.util.logging.Logger; 

public class Write extends Thread { 

    private static final String FileName = "/tmp/Messages.txt"; 
    private static final int port = 8080; 
    private final int time = 5; 
    ServerSocket serverSocket; 
    Socket writeSocket; 

    public static void main(String[] args) { 
     Write write = new Write(); 

     Thread thread = new Thread(new Write()); 
     thread.start(); 

    } 

    @Override 
    public void run() { 
     try { 
//   serverSocket = new ServerSocket(port); 
//   System.out.println("Server listening on port " + port + " ..."); 
//   Socket writeSocket = serverSocket.accept(); 
//   System.out.println("Connected to Client : " + writeSocket.getLocalSocketAddress()); 
// 
//   OutputStream outStream = writeSocket.getOutputStream(); 
//   PrintWriter out = new PrintWriter(outStream, true); 
      BufferedReader input = new BufferedReader(new FileReader(FileName)); 
      String str = ""; 
      while (true) { 
       str = input.readLine(); 

       if (str == null) { 
        input.close(); 
        input = new BufferedReader(new FileReader(FileName)); 
       } else { 
        System.out.println("Outgoing Message>>" + str); 
        //out.println(str); 
        Thread.sleep(time); 
       } 
      } 

     } catch (IOException e) { 
      System.out.println(e); 
     } catch (InterruptedException ex) { 
      Logger.getLogger(Write.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 

} 
+0

謝謝Jose,但我需要通過套接字發送字符串。這對我來說是強制性的。 –

+0

是的,我明白了,但我試圖表明問題不在於處理日誌文件。如果你的線程被鎖定,那麼問題就在其他地方。可能是socket的一些問題,或者客戶端沒有發送更多的數據 –

相關問題