Java TCP客户端/服务器连接问题

时间:2019-12-03 16:27:34

标签: java sockets tcp udp r.java-file

我需要将文件拆分为 4个部分,并将其保存在每台服务器上,然后重新组装该文件。首先,我搜索文件,将其转换为字节,在base64中将其转换为字符串,然后将其分为 4个部分,然后将其发送给每个服务器

enter image description here

在服务器上将文件保存为.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

    }
}

其他人的服务器代码相同。我唯一要更改的是端口。

0 个答案:

没有答案