编辑 - 我已经包含了一些测试类。遗憾的是,对于这些测试文件,服务器不会将任何数据写入从客户端接收的文件中。 Idk为什么要么。这是我能给予的最好的。再次编辑 - 另外,我注意到在测试时,测试文本文件将由客户端读入并打印在终端中。但是,如果我向测试文本文件添加新文本,它仍会读取旧数据。也许这是因为它是在日食目录中,idk。
服务器 - http://pastebin.com/F7xzMdes
SeverMultiCLient - http://pastebin.com/HQM7PyGj
客户 - http://pastebin.com/hBSLZsus
此程序的目标是让客户端将数据写入文件。客户端写入了2个文件。然后,客户端将读取第一个文件的每一行并将其发送到服务器。然后,服务器将每行写入其自己的文件。对于第二个文件再次重复此操作。
什么有效? :
客户端将所有数据写入其文件
客户端在发送到服务器
之前读取每行KIND OF(一些小问题)服务器正在写入数据(错误的数据)
服务器正在将数据写入正确的文件
什么不起作用?:
服务器没有将正确的数据写入其文件 - 这就是问题所在。它一遍又一遍地重复相同的行编辑:真正的问题是它一直从客户端获取的字符串是一遍又一遍。
要比较的文件:
以下2个链接应匹配(除第一行外)通知服务器有一个额外行和重复数据
客户的鼠标Coor http://pastebin.com/RnEGgBJm
服务器的鼠标Coor http://pastebin.com/cBqfLHnf
以下2个链接包含终端会话
服务器从客户端读取的每一行。这是写入服务器文件的内容,这应该与客户端的终端会话http://pastebin.com/A4xqWGiu匹配
客户端在发送到服务器之前从其文件中读取的每一行。发送的相同变量将打印到其终端。对不起图片。注意2个空值。 Idk为什么那些人在那里。 http://i.imgur.com/HTPVzHU.png
这是来自客户端的实际sendData()
//This method will send data to the Client
public void sendData(Object[] data){
try {
oos.writeObject(data);
} catch (IOException e) {
e.printStackTrace();
}
}
客户端用于向服务器发送数据的代码。 (getProgramPath()IS返回正确的路径btw)顺便说一下,代码的两个部分都发送重复数据
private static void sendSavedData(){
try {
System.out.println("CLIENT SEND SAVED DATA: " + getProgramPath() + savedDataFileName + ext);
} catch (IOException e1) {
e1.printStackTrace();
}
//Now send selection data to the server
Object[] selectionData = new Object[2];
selectionData[0] = "Selections";
//selectionData[1] = allGraphs;
BufferedReader br = null;
try {
br = new BufferedReader(new FileReader(getProgramPath() + savedDataFileName + ext));
String line = br.readLine();
while (line != null) {
line = br.readLine();
selectionData[1] = line;
System.out.println("Client Line: " + line);
sendData(selectionData);
}
}
catch(Exception e){
e.printStackTrace();
}
finally {
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
//Now send selection mouse coor data to the server
selectionData = new Object[2];
selectionData[0] = "MouseCoor";
selectionData[1] = "Test here 1";
br = null;
try {
br = new BufferedReader(new FileReader(getProgramPath() + savedDataFileNameMouse + ext));
String line = br.readLine();
while (line != null) {
line = br.readLine();
selectionData[1] = line;
System.out.println("Client Line: " + selectionData[1]);
sendData(selectionData);
}
}
catch(Exception e){
e.printStackTrace();
}
finally {
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
Code Client用于将文件写入hdd然后发送
public static void writeSavedFile(String line, int typeOfData){
if(typeOfData == 0){
FileWriter fstream;
try {
fstream = new FileWriter(getProgramPath() + savedDataFileName + ext, true); //Prepare to append (the "true") to the file
BufferedWriter out = new BufferedWriter(fstream); //More prep
out.write(line); //Write data
out.newLine(); //Write a new line
out.close(); //Close the file
} catch (Exception e) {
e.printStackTrace();
}
}
else if(typeOfData == 1){
FileWriter fstream;
try {
fstream = new FileWriter(getProgramPath() + savedDataFileNameMouse + ext , true); //Prepare to append (the "true") to the file
BufferedWriter out = new BufferedWriter(fstream); //More prep
out.write(line); //Write data
out.newLine(); //Write a new line
out.close(); //Close the file
} catch (Exception e) {
e.printStackTrace();
}
}
}
服务器使用TO READ数据的代码 - 再次写入正确的文件,只是错误的数据。因此,如果需要,它将正确到达选择if和MouseCoor。这个设置是fromClient [0]包含一个标签(Selections,MouseCoor等),fromClient [1]包含要写入的数据。
while(true){
try{
if((fromClient = (Object[]) ois.readObject()) != null){
//Determine what data this is
String tag = (String)fromClient[0]; //Getting the tag
if(tag.equals("ID")){
Server.addClient(serverID, (String)fromClient[1]);
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH-mm-ss");
Date date = new Date();
savedDataFileName = "Server Data - Selections - " + (String)fromClient[1] + " - " + dateFormat.format(date); //The new outputfile name
writeSavedFile("Server Data - Selections - " + (String)fromClient[1] + " - " + dateFormat.format(date),0);
//Now write the mouse coor file
savedDataFileNameMouse = "Server Data - Mouse Coor - " + (String)fromClient[1]; //The default naming for the outputfile
//The file will be saved with the date and time
savedDataFileNameMouse = "Server Data - Mouse Coor - " + (String)fromClient[1] + " - " + dateFormat.format(date); //The new outputfile name
writeSavedFile(savedDataFileNameMouse, 1);
}
else if(tag.equals("Selections")){
System.out.println("Server Line: " + (String)fromClient[1]);
writeSavedFile((String)fromClient[1], 0);
}
else if(tag.equals("MouseCoor")){
System.out.println("Server Line: " + (String)fromClient[1]);
writeSavedFile((String)fromClient[1], 1);
}
else{
System.out.println("WARNING - UNKNOWN DATA RECEIVED");
}
}
}
代码服务器用于写文件
//Write saved data: 0 = Selections 1 = Mouse Coor
public static void writeSavedFile(String line, int typeOfData){
if(typeOfData == 0){
FileWriter fstream;
try {
fstream = new FileWriter(Server.getProgramPath() + savedDataFileName + ext, true); //Prepare to append (the "true") to the file
BufferedWriter out = new BufferedWriter(fstream); //More prep
out.write(line); //Write data
out.newLine(); //Write a new line
out.flush();
out.close(); //Close the file
fstream.close();
} catch (Exception e) {
e.printStackTrace();
}
}
else if(typeOfData == 1){
FileWriter fstream;
try {
fstream = new FileWriter(Server.getProgramPath() + savedDataFileNameMouse + ext , true); //Prepare to append (the "true") to the file
BufferedWriter out = new BufferedWriter(fstream); //More prep
out.write(line); //Write data
out.newLine(); //Write a new line
out.close(); //Close the file
fstream.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
答案 0 :(得分:1)
我编译并测试了你添加到问题中的代码,这真的很奇怪。我正在重现你的错误,但写入套接字之前的对象已经改变了。
然后我添加了我自己的字符串数组,在你传递的字符串后直接写入,并且工作正常。这导致我假设objectOutputStream执行某种缓存。
我设法通过切换线来修复它;
oos.writeObject(data);
使用
oos.writeObject(new String[]{(String)data[0],(String)data[1]});
所以我检查了文档以找到引用它的任何内容,我找到了方法reset()。这证实了我怀疑它们是高效的而不是重新序列化/发送相同地址的对象。它还为您提供更清洁的解决方案。致电oos.reset()
后,只需致电oos.writeObject(data)
。
在Client.java类中,您还应修复文件读取循环,因为它们当前错过了第一行并读取了一行null。
String line;
while ((line = br.readLine()) != null) {
selectionData[1] = line;
System.out.println("Client Line2: " + selectionData[1]);
sendData(selectionData);
}
在你的MultiServerClient.java中,你应该真正创建一个系统,在这个系统中,在将每一行写入文件之前和之后不打开和关闭文件流,你应该能够在打开连接时打开它一次然后在连接关闭后关闭它。
感谢有趣的拼图!