gpt4 book ai didi

java - TCP 不写入完整文件?

转载 作者:可可西里 更新时间:2023-11-01 02:57:56 26 4
gpt4 key购买 nike

我正在尝试使用一个程序将一个文本文件写入多个套接字。用于覆盖文本文件的代码如下:

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 文本,我将在第一句话周围的某个地方丢失。

有人知道为什么会这样吗?我几乎尝试了所有方法,但似乎无法解决问题

最佳答案

您首先创建一个 BufferedReader bin 并使用它来读取命令的一行。但是,这并不意味着只有这一行是从输入流中读取的。取而代之的是读取更多字节,但 BufferedReader bin 只返回这些字节的第一行,其余部分保存在 BufferedReader 的缓冲区内(这就是名称的原因!) .

稍后您尝试读取有效载荷,而不是使用阅读器 bin 您已经创建了一个新的 reader 并从中读取。通过这种方式,您可以忽略任何已在 bin 中缓冲的字节 - 这意味着您丢失了字节。

关于java - TCP 不写入完整文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37194280/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com