繁体   English   中英

客户端拒绝连接

[英]Connection Refused with Clients

我进行了搜索,但找不到与我的问题相关的解决方案。 我正在尝试将整数发送到服务器以使用多线程计算其阶乘。 但是我收到“连接被拒绝”错误。 这是我的代码:

package ohw3;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.*;
import java.net.*;
import java.util.Date;
import javax.swing.*;
import javax.swing.border.TitledBorder;

public class MathClient extends JFrame {

    static JTextArea jta = new JTextArea(5, 1);

public static void main(String[] args) {
    new MathClient();
}

public MathClient() {
    setTitle("Factorial Calculator");
    setSize(400, 300);
    setLocationRelativeTo(null);
    setResizable(false);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    add(new JScrollPane(jta), BorderLayout.NORTH);

    JPanel panel1 = new JPanel();
    panel1.setBorder(new TitledBorder("Factorial Calculator"));
    panel1.setFocusable(true);

    JLabel necess = new JLabel("Please Enter the Integer:");
    panel1.add(necess, BorderLayout.SOUTH);

    final JTextField integer = new JTextField(15);
    panel1.add(integer);

    JButton send = new JButton("Calculate");
    panel1.add(send, BorderLayout.NORTH);

    add(panel1);

    setVisible(true);

    try {
        // Create a server socket
        ServerSocket serverSocket = new ServerSocket(1080);
        serverSocket.setSoTimeout(3000);
        jta.append("MultiThreadServer started at '' " + new Date() + " ''\n");

        // Number a client
        int clientNo = 1;

        while (true) {
            // Listen for a new connection request
            final Socket socket = new Socket("localhost", 1080);

            // Display the client number
            jta.append("Starting thread for client " + clientNo
                    + " at '' " + new Date() + " ''\n");

            // Find the client's host name, and IP address
            InetAddress inetAddress = socket.getInetAddress();
            jta.append("Client " + clientNo + "'s host name is "
                    + inetAddress.getHostName() + "\n");
            jta.append("Client " + clientNo + "'s IP Address is "
                    + inetAddress.getHostAddress() + "\n");


                send.addActionListener(new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        int value = Integer.parseInt(integer.getText());

                        // Create a new thread for the connection
                        MultiThreadedMathServer task = new      MultiThreadedMathServer(socket, value);

                        // Start the new thread
                        new Thread(task).start();
                }
              });



            // Increment clientNo
            serverSocket.close();
            clientNo++;
        }
    } catch (IOException ex) {
        System.err.println(ex);
    }
}

class MultiThreadedMathServer implements Runnable {

    private final Socket socket; // A connected socket
    private final int numb; // A connected socket

    /**
     * Construct a thread
     */
    public MultiThreadedMathServer(Socket socket, int numb) {
        this.socket = socket;
        this.numb = numb;
    }

    /**
     * Run a thread
     */
    @Override
    public void run() {
        try {
            // Create data input and output streams
            DataInputStream inputFromClient = new DataInputStream(
                    socket.getInputStream());
            DataOutputStream outputToClient = new DataOutputStream(
                    socket.getOutputStream());

            // Continuously serve the client
            while (true) {
                // Receive radius from the client
                int integer = inputFromClient.readInt();

                // Compute area
                int fact = 1;

                for (int i = integer; i > 0; i--) {
                    fact = fact * i;
                }

                // Send area back to the client
                outputToClient.writeDouble(fact);

            }
        } catch (IOException e) {
            System.err.println(e);
        }
    }
}

}

您的服务器没有接受连接的规定,因此它不知道如何处理传入的连接。

Socket clientSocket = socket.accept();
// and then you can use the socket for reading and writing.

但是我建议您复习一下有关Java网络的很好的教程,例如官方教程

正如fvu所说,您的服务器不接受套接字。 而且, MultiThreadedMathServer线程初始化看起来放错了地方。 您应该在服务器上收到的每个新接受的套接字连接上创建它。 就像是:

while(true){
    MultiThreadedMathServer task = new MultiThreadedMathServer(serverSocket.accept(), value);
    new Thread(task).start(); //this thread will deal with this client
}

因为, serverSocket.accept()将挂起,直到新的连接到达为止,到达后,新线程将处理该套接字,服务器将再次返回到accept()新套接字。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM