2015-05-22 5 views
1

У меня есть клиент/серверное приложение, использующее сокеты, в которые клиент вводит текст по строкам. На стороне сервера я хочу, чтобы один поток должен получать текст по одной строке за раз, а второй поток должен записывать одну и ту же строку в файл. Это продолжается, пока клиент не остановится. Мой сервер получает текстовые строки, но второй поток не записывает их в файл.Запись файла с использованием сокетов и потоков

Ниже приведен код сервера, который получает текст.

public class EchoServer extends Thread { 
    public static String line = "none"; 

    public EchoServer(int portnum) { 
     try { 
      server = new ServerSocket(portnum); 
     } catch (Exception err) { 
      System.out.println(err); 
     } 
    } 

    public void run() { 
     try { 
      while (true) { 
       Socket client = server.accept(); 
       BufferedReader r = new BufferedReader(
         new InputStreamReader(client.getInputStream())); 
       PrintWriter w = new PrintWriter(client.getOutputStream(), 
         true); 
       // w.println("Welcome to the Java EchoServer. Type 'bye' to close."); 
       while ((line = r.readLine()) != null) { 
        // read from Cleint 
        if (line != null) { 
         // p.destroy(); 
         System.out.println(line); 
         // sleep(2000); 
        } 
        Thread.yield(); 
       } 
       client.close(); 
      } 
     } catch (Exception err) { 
      System.err.println(err); 
     } 
    } 
    private ServerSocket server; 
} 

Ниже поток, который записывает в файл

public class paste extends Thread { 
    // To create producer and consumer as threads 
    // Shared variable 
    public static int x = 0; // Maximum Limit to simulate a buffer 
    public String l; 
    public static int j = 1; 

    public void run() { 
     System.out.println("n"); 
     if (EchoServer.line != "none") { 
      String fileName = "c:/sys prg lab/salfar1.txt"; 
      try { 
       // Assume default encoding. 
       FileWriter fileWriter = new FileWriter(fileName, true); 
       // Always wrap FileWriter in BufferedWriter. 
       BufferedWriter bufferedWriter = new BufferedWriter(
         fileWriter); 
       // Note that write() does not automatically 
       // append a newline character. 
       bufferedWriter.write(EchoServer.line); 
       bufferedWriter.newLine(); 
       System.out.println("y"); 
       EchoServer.line = "none"; 
       // Always close files. 
       bufferedWriter.close(); 
      } catch (IOException ex) { 
       System.out.println("Error writing to file '" + fileName 
         + "'"); 
       // Or we could just do this: 
       // ex.printStackTrace(); 
      } 
      Thread.yield(); 
     } 
    } 
} 

и нижеследующее является основной функцией

public class execute { 
    public static void main(String[] args) { 
     EchoServer s = new EchoServer(9999); 
     paste p = new paste(); 
     s.start(); 
     p.start(); 
    } 
} 
+0

Использование Thread.yield() сильно обескуражено, поскольку все современные ОС используют принудительное (vs совместное) планирование потоков, а также потому, что большинство современных систем работают с несколькими ядрами. Вы не можете синхронизировать потоки таким образом – ControlAltDel

ответ

2

Мне кажется, что ваш второй поток запускается один раз, а затем выходит , поэтому, когда ваш сервер получает текст, поток записи уже возвращается. Попробуйте использовать while(true), как в деле с сервером.

+0

Этот код для второго потока прав? –

+0

Да, теперь я отредактировал ответ, поскольку увидел, что вы уже используете 'while (true)' в потоке сервера. –

+0

Работал как шарм. :) Можно также сделать на стороне клиента, если я хочу, чтобы отдельные потоки копировали строку из файла, а затем отправляли на клиентский поток. –

Смежные вопросы