Search code examples
javasocketsdatagram

Couldn't write in a file when receiving the data via socket connection in java


I tried to implement a send-receive example via a socket but It didn't work well. The sender sends the data successfully and the Receiver receives the data and shown in the console but I want to save this data in a file and I couldn't. As I noticed that the receiver keeps listeninig without ending the while loop. So can anyone help me to solve this problem ?

The Sender module

import java.io.*;
import java.net.*; 
import java.util.*;


public class UDPSend {


 public static void main(String[] args) throws IOException
  {
      FileInputStream fstream = new FileInputStream("T.txt");
      DataInputStream in = new DataInputStream(fstream);
      BufferedReader br = new BufferedReader(new InputStreamReader(in));

      File file = new File("T.txt");
      FileInputStream fis = new FileInputStream(file);
      byte[] fsize = new byte[(int) file.length()];
      int size = fis.read(fsize);
                System.out.println("Size = " + size);



      InetAddress addr = InetAddress.getByName("localhost");
      byte[]  buf  = new byte[10000];

      String DataLine; 
      while ((DataLine = br.readLine()) != null)  
      { 
                DatagramPacket packet =new DatagramPacket(DataLine.getBytes(),         DataLine.length() , addr, 4555);
          System.out.println (DataLine);
          DatagramSocket socket = new DatagramSocket();
          socket.send(packet);

      }//end while loop


  }//end main method 

 }

The Receiver module

import java.io.*;
import java.net.*;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;

public class UDPRecieve {



public static void main(String args[]) throws Exception
      {

      FileWriter fw = new FileWriter(new File("D:/JavaPrograms/Multimedia-proj-2/src/outtt.txt"));
      fw.write("hi");
      try{
      //DatagramSocket serverSocket = new DatagramSocket(4555);
      DatagramSocket Socket = new DatagramSocket(4555);
      byte[] receiveData = new byte[1000000];    
     // byte[] sendData = new byte[1024];
      //while(true)
      while(receiveData !=null)
         {  
            DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
            Socket.receive(receivePacket);
            String sentence = new String( receivePacket.getData());
            fw.write(sentence);
            fw.flush();
            System.out.printf("RECEIVED: %s " , new String(receivePacket.getData()));
            //System.out.println("Done");
            //InetAddress IPAddress = receivePacket.getAddress();
            //int port = receivePacket.getPort();
            //String capitalizedSentence = sentence.toUpperCase();
           /* sendData = capitalizedSentence.getBytes();
            DatagramPacket sendPacket =
            new DatagramPacket(sendData, sendData.length, IPAddress, port);
            serverSocket.send(sendPacket);*/
         }


      fw.flush();
      fw.close(); 

      } catch (Exception e) {
          System.err.println(e);
        }

    }
}

Thanks in advance.


Solution

  • You can achive it by following code changes.In Receiver class make changes in following loop.

    while (receiveData != null) {
                    DatagramPacket receivePacket = new DatagramPacket(receiveData,
                            receiveData.length);
                    Socket.receive(receivePacket);
                    String sentence = new String(receivePacket.getData());
                    fw.write(sentence.trim());
                    fw.flush();
                    System.out.printf("RECEIVED: %s ", new String(receivePacket
                            .getData()));
                    // System.out.println("Done");
                    // InetAddress IPAddress = receivePacket.getAddress();
                    // int port = receivePacket.getPort();
                    // String capitalizedSentence = sentence.toUpperCase();
                    /*
                     * sendData = capitalizedSentence.getBytes(); DatagramPacket
                     * sendPacket = new DatagramPacket(sendData, sendData.length,
                     * IPAddress, port); serverSocket.send(sendPacket);
                     */
                }
    

    EDIT

    Complete Code of the Program which is running successfully.

    Sender

    import java.io.BufferedReader;
    import java.io.DataInputStream;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    import java.net.InetAddress;
    
    
    public class UDPSend {
    
    
     public static void main(String[] args) throws IOException
      {
          FileInputStream fstream = new FileInputStream("D:/T.txt");
          DataInputStream in = new DataInputStream(fstream);
          BufferedReader br = new BufferedReader(new InputStreamReader(in));
    
          File file = new File("D:/T.txt");
          FileInputStream fis = new FileInputStream(file);
          byte[] fsize = new byte[(int) file.length()];
          int size = fis.read(fsize);
                    System.out.println("Size = " + size);
    
    
    
          InetAddress addr = InetAddress.getByName("localhost");
          byte[]  buf  = new byte[10000];
    
          String DataLine; 
          while ((DataLine = br.readLine()) != null)  
          { 
                    DatagramPacket packet =new DatagramPacket(DataLine.getBytes(),         DataLine.length() , addr, 4555);
              System.out.println (DataLine);
              DatagramSocket socket = new DatagramSocket();
              socket.send(packet);
    
          }//end while loop
    
    
      }//end main method 
    
     }
    

    Receiver

    import java.io.File;
    import java.io.FileWriter;
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    
    public class UDPReceive {
    
        public static void main(String args[]) throws Exception {
    
            FileWriter fw = new FileWriter(new File(
                    "D:/outtt.txt"));
            fw.write("hi");
            try {
                // DatagramSocket serverSocket = new DatagramSocket(4555);
                DatagramSocket Socket = new DatagramSocket(4555);
                byte[] receiveData = new byte[1000000];
                // byte[] sendData = new byte[1024];
                // while(true)
                while (receiveData != null) {
                    DatagramPacket receivePacket = new DatagramPacket(receiveData,
                            receiveData.length);
                    Socket.receive(receivePacket);
                    String sentence = new String(receivePacket.getData());
                    fw.write(sentence.trim());
                    fw.flush();
                    System.out.printf("RECEIVED: %s ", new String(receivePacket
                            .getData()));
                    // System.out.println("Done");
                    // InetAddress IPAddress = receivePacket.getAddress();
                    // int port = receivePacket.getPort();
                    // String capitalizedSentence = sentence.toUpperCase();
                    /*
                     * sendData = capitalizedSentence.getBytes(); DatagramPacket
                     * sendPacket = new DatagramPacket(sendData, sendData.length,
                     * IPAddress, port); serverSocket.send(sendPacket);
                     */
                }
    
                fw.flush();
                fw.close();
    
            } catch (Exception e) {
                System.err.println(e);
            }
    
        }
    }