[英]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.