我需要将文件拆分为 4个部分,并将其保存在每台服务器上,然后重新组装该文件。首先,我搜索文件,将其转换为字节,在base64中将其转换为字符串,然后将其分为 4个部分,然后将其发送给每个服务器。
在服务器上将文件保存为.txt文件,我在服务器上有2个函数,一个要保存,另一个要返回。问题出在返回时,它显示以下消息:
java.net.ConnectException: Connection refused: connect
at java.net.DualStackPlainSocketImpl.connect0(Native Method)
at java.net.DualStackPlainSocketImpl.socketConnect(Unknown Source)
at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source)
at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source)
at java.net.AbstractPlainSocketImpl.connect(Unknown Source)
at java.net.PlainSocketImpl.connect(Unknown Source)
at java.net.SocksSocketImpl.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at java.net.Socket.<init>(Unknown Source)
at java.net.Socket.<init>(Unknown Source)
at Main$2.actionPerformed(Main.java:122)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$500(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
Client.java
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import javax.swing.*;
import java.awt.event.*;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.util.Arrays;
import java.util.Base64;
import java.io.*;
import java.net.*;
public class Main extends JFrame {
static JFrame f;
static JList l;
static String fd;
private static String RECEIVE = "RECEIVE";
private static String SENDER = "SENDER";
public static void main(String[] args) throws IOException {
f = new JFrame("Client");
JPanel p = new JPanel();
DefaultListModel<String> model = new DefaultListModel<>();
JList<String> l = new JList<>( model );
p.add(l);
final JFileChooser fc = new JFileChooser();
fc.setMultiSelectionEnabled(true);
fc.setCurrentDirectory(new File("C:\\"));
JButton btn2 = new JButton("Open File");
btn2.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
int retVal = fc.showOpenDialog(f);
if (retVal == JFileChooser.APPROVE_OPTION) {
File[] selectedfiles = fc.getSelectedFiles();
StringBuilder sb = new StringBuilder();
for (int i = 0; i < selectedfiles.length; i++) {
File file = new File(selectedfiles[i].getAbsolutePath());
if (file.length() <= 4000000) {
model.addElement(selectedfiles[i].getName());
try {
byte[] fileContent = Files.readAllBytes(file.toPath());
String byteArrayStr = new String(Base64.getEncoder().encode(fileContent));
int size = byteArrayStr.length() / 4;
String[] ar = split(byteArrayStr, size);
InetAddress host = InetAddress.getLocalHost();
Socket socket = null;
ObjectOutputStream oos = null;
ObjectInputStream ois = null;
// Server 1
socket = new Socket(host.getHostName(), 9876);
oos = new ObjectOutputStream(socket.getOutputStream());
System.out.println(SENDER + "," + (model.getSize() - 1) + "," + ar[0]);
oos.writeObject(SENDER + "," + (model.getSize() - 1) + "," + ar[0]);
oos.close();
socket.close();
// Server 2
socket = new Socket(host.getHostName(), 9877);
oos = new ObjectOutputStream(socket.getOutputStream());
System.out.println(SENDER + "," + (model.getSize() - 1) + "," + ar[1]);
oos.writeObject(SENDER + "," + (model.getSize() - 1) + "," + ar[1]);
oos.close();
// Server 3
socket = new Socket(host.getHostName(), 9878);
oos = new ObjectOutputStream(socket.getOutputStream());
System.out.println(SENDER + "," + (model.getSize() - 1) + "," + ar[2]);
oos.writeObject(SENDER + "," + (model.getSize() - 1) + "," + ar[2]);
oos.close();
// Server 4
socket = new Socket(host.getHostName(), 9879);
oos = new ObjectOutputStream(socket.getOutputStream());
System.out.println(SENDER + "," + (model.getSize() - 1) + "," + ar[3]);
oos.writeObject(SENDER + "," +(model.getSize() - 1) + "," + ar[3]);
oos.close();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
} else {
}
}
}
}
});
JButton btn3 = new JButton("Save file");
btn3.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
int retVal = fc.showSaveDialog(f);
File file = fc.getSelectedFile();
if (retVal == JFileChooser.APPROVE_OPTION) {
try {
InetAddress host = InetAddress.getLocalHost();
Socket socket = null;
ObjectOutputStream oos = null;
ObjectInputStream ois = null;
int selectedIndex = l.getSelectedIndex();
String m_f = null;
// Server 1
socket = new Socket(host.getHostName(), 9876);
oos = new ObjectOutputStream(socket.getOutputStream());
oos.writeObject(RECEIVE + "," + selectedIndex);
ois = new ObjectInputStream(socket.getInputStream());
m_f.concat((String) ois.readObject());
ois.close();
oos.close();
// Server 2
socket = new Socket(host.getHostName(), 9877);
oos = new ObjectOutputStream(socket.getOutputStream());
oos.writeObject(RECEIVE + "," + selectedIndex);
ois = new ObjectInputStream(socket.getInputStream());
m_f.concat((String) ois.readObject());
ois.close();
oos.close();
// Server 3
socket = new Socket(host.getHostName(), 9878);
oos = new ObjectOutputStream(socket.getOutputStream());
oos.writeObject(RECEIVE + "," + selectedIndex);
ois = new ObjectInputStream(socket.getInputStream());
m_f.concat((String) ois.readObject());
ois.close();
oos.close();
// Server 4
socket = new Socket(host.getHostName(), 9879);
oos = new ObjectOutputStream(socket.getOutputStream());
oos.writeObject(RECEIVE + "," + selectedIndex);
ois = new ObjectInputStream(socket.getInputStream());
m_f.concat((String) ois.readObject());
ois.close();
oos.close();
try (FileOutputStream fos = new FileOutputStream(file.getAbsolutePath() + "\\" + l.getSelectedValue())) {
fos.write(Base64.getDecoder().decode(m_f.getBytes()));
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
} catch (IOException e2) {
// TODO Auto-generated catch block
e2.printStackTrace();
} catch (ClassNotFoundException e2) {
// TODO Auto-generated catch block
e2.printStackTrace();
}
}
}
});
p.add(btn2);
p.add(btn3);
f.add(p);
f.setSize(550,550);
f.show();
}
public static String[] split(String src, int len) {
String[] result = new String[(int)Math.ceil((double)src.length()/(double)len)];
for (int i=0; i<result.length; i++)
result[i] = src.substring(i*len, Math.min(src.length(), (i+1)*len));
return result;
}
}
Server.java
import java.io.*;
import java.net.*;
import java.nio.file.Files;
import java.nio.file.Paths;
public class Main implements Runnable {
private static String RECEIVE = "RECEIVE";
private static String SENDER = "SENDER";
private static ServerSocket server;
private static int port = 9876;
public static void main(String[] args) throws IOException, ClassNotFoundException {
server = new ServerSocket(port);
while(true) {
// System.out.println("Waiting for the client request");
Socket socket = server.accept();
ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
String message = (String) ois.readObject();
System.out.println(message);
String[] r = message.split(",");
if (r[0].equals(SENDER)) {
BufferedWriter output = null;
File file = new File(r[1] + ".txt");
output = new BufferedWriter(new FileWriter(file));
output.write(r[2]);
output.close();
}
if (r[0].equals(RECEIVE)) {
BufferedReader content = Files.newBufferedReader(Paths.get(r[1] + ".txt"));
oos.writeObject(content);
}
ois.close();
oos.close();
socket.close();
if(message.equalsIgnoreCase("exit")) break;
}
server.close();
}
@Override
public void run() {
// TODO Auto-generated method stub
}
}
其他人的服务器代码相同。我唯一要更改的是端口。