Я пытаюсь написать текстовый файл для нескольких сокетов, используя одну программу. Код, используемый для написания текстового файла через это выглядит следующим образом:TCP не пишет полный файл?
import java.io.*;
import java.net.*;
public class Server {
public static void main(String args[]) throws Exception{
String servers[] = {"127.0.0.1","127.0.0.1","127.0.0.1"};
int[] ports = {4525, 4003,3621};
String fileName = "example";
for(int i = 0; i < servers.length; i++){
getFile(fileName, InetAddress.getByName(servers[i]), ports[i], "1");
}
}
public static void getFile(String fileName, InetAddress ia, int port, String vers) throws Exception{
Socket myServers = new Socket(ia, port);
PrintWriter pwSoc = new PrintWriter(myServers.getOutputStream(), true);
pwSoc.println(fileName + " " + "write " + vers);
InputStream is = null;
int i =0;
while(i < 20000){
i++;
}
int c;
try{
is = new FileInputStream(fileName + ".txt");
}
catch(Exception e){
System.out.println("Error. This file is not found");
return;
}
while ((c = is.read()) != -1) {
pwSoc.println((char)c);
pwSoc.flush();
}
pwSoc.close();
is.close();
pwSoc.close();
return;
}
}
Затем на стороне сервера (для всех трех серверов), я использую следующий поток, который оценивает в else if(req.equals("write")){
блок коды:
import java.io.*;
import java.net.*;
import java.util.StringTokenizer;
public class ServerRequestThread implements Runnable{ //Server 1
Socket client;
File[] files;
VersionInfo vi;
public ServerRequestThread(Socket s, VersionInfo vi) throws Exception{
this.client = s;
String filePath = new File(".").getCanonicalPath();
this.files = new File(filePath).listFiles();
this.vi = vi;
}
public void run() {
String req = "", reversedString = "";
try {
while(true){
InputStream in = client.getInputStream();
BufferedReader bin = new BufferedReader(new InputStreamReader(in));
String ex = bin.readLine();
StringTokenizer st = new StringTokenizer(ex, " ");
String fileName = st.nextToken();
if(fileName.equals("done")){
return;
}
else if(fileName.equals("fileList")){
String returnList = showFiles(files).trim();
PrintWriter pout = new PrintWriter(client.getOutputStream(), true);
pout.println(returnList);
pout.close();
}
else if(fileName.equals("filecatchup")){
PrintWriter pout = new PrintWriter(client.getOutputStream(), true);
pout.println(vi.printHash());
pout.close();
}
else{
req = st.nextToken();
}
if(req.equals("read")){
PrintWriter pout = new PrintWriter(client.getOutputStream(), true);
int c;
InputStream is = null;
try{
is = new FileInputStream(fileName + ".txt");
}
catch(Exception e){
pout.println("File could not be found");
return;
}
while ((c = is.read()) != -1) {
pout.println((char)c);
}
pout.close();
return;
}
else if(req.equals("write")){
if(st.hasMoreTokens()){
String vers = st.nextToken();
vi.updateHash(fileName, Integer.parseInt(vers));
System.out.println("The file " + fileName + " was updated (via remote update) to v." + vers);
}
else{
vi.updateFile(fileName);
System.out.println("The file " + fileName + " was updated to v." + vi.getFile(fileName));
}
InputStream in2 = client.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(in2));
reversedString = reader.readLine();
PrintWriter out = new PrintWriter(fileName + ".txt");
while(reversedString != null){
//cont+=reversedString;
out.print(reversedString);
reversedString = reader.readLine();
}
reader.close();
out.close();
return;
}
}
} catch (Exception e) {}
}
public String showFiles(File[] files) throws Exception {
String ret = "";
//System.out.println("Path: " + new File(".").getCanonicalPath());
for (File file : files) {
if (file.isDirectory()) {
//System.out.println("Directory: " + file.getName());
showFiles(file.listFiles()); // Calls same method again.
} else {
if(file.getName().toLowerCase().endsWith(".txt")){
ret+= " " + file.getName();
}
}
}
return ret;
}
}
По какой-то причине, когда я пишу, весь файл не переходит на другую сторону. Скорее, я пропускаю где-то около первых 100 байт файла. Например, если я напишу текст Lorem Ipsum, я буду отсутствовать где-то вокруг первого предложения.
Кто-нибудь знает, почему это происходит? Я пробовал почти все, но я не могу исправить проблему.
Это была именно та проблема, которую я только что обнаружил. Спасибо за помощь! – svsav