簡體   English   中英

通過Java中的套接字連接接收數據時無法寫入文件

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

我試圖通過套接字實現一個收發示例,但效果不佳。 發送方成功發送數據,接收方接收到數據並顯示在控制台中,但是我想將此數據保存在文件中,但我不能。 正如我注意到的那樣,接收方保留了listeninig而不結束while循環。 那么有人可以幫助我解決這個問題嗎?

發件人模塊

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

    }
}

提前致謝。

您可以通過以下代碼更改來實現它。在Receiver類中,在以下循環中進行更改。

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

編輯

成功運行的程序的完整代碼。

發件人

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

    }
}

查看您的接收器循環:

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在這個循環? 循環怎么結束?

假設您使用的是UDP而不是TCP,那么您實際上並沒有連接,那么如何期望知道編寫者何時停止編寫? 另外,您應該考慮數據包亂序到達的可能性。

暫無
暫無

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

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