我搜索了一下,找不到解决我问题的相关方法。我正试图发送整数到服务器,用多线程计算它的阶乘。但我得到“连接被拒绝”的错误。这是我的密码:
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);
}
}
}
}
2条答案
按热度按时间lskq00tm1#
正如fvu所说,您的服务器不接受套接字。也,
MultiThreadedMathServer
线程初始化似乎放错了位置。您应该在服务器上接收到的每个新接受的套接字连接上创建它。比如:因为,
serverSocket.accept()
将一直挂起,直到新连接到达,到达后一个新线程将处理该套接字,服务器将返回accept()
又是新插座。gojuced72#
您的服务器没有接受连接的规定,因此它不知道如何处理传入的连接。
但是我建议您复习一个关于java网络的好教程,比如官方教程。