2012-05-13 18 views
1

ソケット経由で送受信の例を実装しようとしましたが、うまく動作しませんでした。送信者はデータを正常に送信し、受信者はデータを受信して​​コンソールに表示しますが、このデータをファイルに保存することはできません。私は受信者がwhileループを終了することなくlisteninigを保持していることに気づいた。だから誰も私はこの問題を解決するのを助けることができますか?ソケット接続を介してデータを受信するときにファイルに書き込めませんでした

のSenderモジュール

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 

} 

レシーバモジュール事前に

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); 
     } 

    } 
} 

感謝。あなたの受信機ループで

+1

あなたが言うとき、 "私は、ファイルにこのデータを保存したいと私はできなかった" あなたは何を意味するの?例外がありますか?ファイルは空ですか? – shem

+0

これは論理エラーです。私はコマンドラインでデータを受け取ることができますが、何もwhileループを破壊しません。 –

+0

それは質問にあるはずの情報の種類です – keyser

答えて

1

以下のコード変更で、受信者クラスを変更することができます。以下のループで受信者クラスを変更します。

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

成功し実行しているプログラムの完全なコード。

送信者

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 

} 

レシーバー

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); 
     } 

    } 
} 
+0

私はそれをテストし、私は同じ問題があります。 –

+0

@SaharNadi私はマシン上で正常に動作しているプログラム全体を更新しました。 –

+0

ありがとうございます、今は正常に動作しています。 –

0

ルック:

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())); 
} 

は、さまざまな文字エンコーディングの問題などはともかく、どのようにこれまでreceiveDataがそのループ内nullになることを期待しますか?どのようにできるループエンド?

TCPの代わりにUDPを使用しているとすれば、実際には接続していないため、書き込みが停止したときをどう思いますか?さらに、パケットの順序が乱れる可能性も考慮する必要があります。

+0

私のコードは、UDPプロトコルを使用する必要があります。では、受信したデータがループ内でヌルになることをどのように確認できますか? –

+0

@SaharNadi:受信したデータ*はnullになりません。 TCPのようなものではありません。接続が閉じられると、あなたのプロトコルにある種の「完成した」パケットを構築する必要があります。また、パケットを順不同で受信する可能性も認識しておく必要があります。私はあなたがUDPで読むべきだと思っています - あなたはストリームベースのプロトコルを持っているかのように現在それを使用しようとしています。 –

+0

情報に感謝します。 –

関連する問題