当前位置: 首页 > 知识库问答 >
问题:

java客户端服务器项目中的连接超时错误

巢安澜
2023-03-14

我正在学习一些基本的java网络知识,我试图让我学到的东西变成现实,所以当我在同一台计算机上运行我的服务器和客户端类时,它运行时没有错误,但是当我将客户端项目带到另一台计算机并运行项目运行服务器后,它冻结并打印连接超时语句。

这是我的服务器代码

package sample;

import javafx.application.Application;
import javafx.application.Platform;
import javafx.scene.Scene;
import javafx.scene.control.ScrollPane;
import javafx.scene.control.TextArea;
import javafx.stage.Stage;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Date;

public class Main extends Application {

    @Override
    public void start(Stage primaryStage) throws Exception{
        TextArea ta = new TextArea();
        primaryStage.setTitle("server");
        primaryStage.setScene(new Scene(new ScrollPane(ta), 450, 200));
        primaryStage.show();

        new Thread(()->{
           try {
               ServerSocket ss = new ServerSocket(8000);
               Platform.runLater(() ->
                       ta.appendText("Server started at " + new Date() + '\n'));

           Socket s = ss.accept();

           DataInputStream inputFromClient = new DataInputStream(s.getInputStream());
           DataOutputStream outputToClient = new DataOutputStream(s.getOutputStream());

           while (true) {
               double radius = inputFromClient.readDouble();

               double area = radius * radius * Math.PI;
               outputToClient.writeDouble(area);

               Platform.runLater(() -> {
                   ta.appendText("Radius received from client: "
                           + radius + '\n');
                   ta.appendText("Area is: " + area + '\n');
                   });
           }

       } catch (Exception e){
            e.printStackTrace();
       }
    }).start();
    }



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

这是我的客户

package sample;

import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.ScrollPane;
import javafx.scene.control.TextArea;
import javafx.scene.control.TextField;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;

public class Main extends Application {

DataOutputStream toServer = null;
DataInputStream fromServer = null;

public void start(Stage primaryStage) {

    BorderPane pane = new BorderPane();
    pane.setPadding(new Insets(5, 5, 5, 5));
    pane.setStyle("-fx-border-color: green");
    pane.setLeft(new Label("Enter a radius: "));

    TextField tf = new TextField();
    tf.setAlignment(Pos.BOTTOM_RIGHT);
    pane.setCenter(tf);

    BorderPane mainPane = new BorderPane();

    TextArea ta = new TextArea();
    mainPane.setCenter(new ScrollPane(ta));
    mainPane.setTop(pane);
    Scene scene = new Scene(mainPane, 450, 200);
    primaryStage.setTitle("Client"); // Set the stage title
    primaryStage.setScene(scene); // Place the scene in the stage
    primaryStage.show(); // Display the stage
    tf.setOnAction(e -> {

        try {
            Socket socket = new Socket("server IP address", 8000);
            fromServer = new DataInputStream(socket.getInputStream());
            toServer = new DataOutputStream(socket.getOutputStream());
        } catch (IOException ex) {
            ta.appendText(ex.toString() + '\n');
        }

        try {
            double radius = Double.parseDouble(tf.getText().trim());

            toServer.writeDouble(radius);
            toServer.flush();

            double area = fromServer.readDouble();

            ta.appendText("Radius is " + radius + "\n");
            ta.appendText("Area received from the server is "
                    + area + '\n');
        } catch (IOException ex) {
            System.err.println(ex);
        }

    });

}
}

共有2个答案

令狐建修
2023-03-14

在服务器类中,您在端口8000上创建了一个服务器套接字,这对于内部和外部连接都很好。但是,您的客户端类尝试创建没有给定IP地址的套接字

Socket socket = new Socket("server IP address", 8000);

通过传递字符串“Server ip address”,实际上是告诉java查找本地服务器,因为您没有传递正确的ip地址。

因此,当两个类都在同一个系统上运行时,只有端口才起作用,但您需要确定服务器的IP地址,以便客户机知道在哪里查找其连接(如果它们不在同一个系统上)。

郭兴文
2023-03-14

问题解决了

我只需要更改服务器上的网络设置,这样就可以在我的网络上发现它

 类似资料:
  • 当我尝试使用套接字将物理设备连接到服务器时,我遇到了一个问题。在服务器端,它似乎不接受任何连接,而在客户端,套接字超时。你知道为什么会这样吗? 我在下面提供我的代码 服务器代码: 客户端: 11-16 23:32:11.016:W/系统。错误(24213):java.net。ConnectException:无法连接到/192.168.1.116(端口9090):连接失败:ETIMEDOUT(连接

  • 我有一个示例Spring启动应用程序来运行图形QL服务器,具有作为客户端,我的pom有以下依赖项: 当我尝试从客户端连接时,出现以下错误: 狩猎决议好心建议。 我还有几个问题: 我应该使用SimpleGraphQLHttpServlet将请求路由到endpoint吗 我正在React UI上使用apollo client,那么它是强制使用apollo server还是spring boot可以工作

  • 下面是我的服务器代码: 下面是我的客户端活动代码: 以下是客户端活动的xml布局文件: 因此,我开始认为这不是连接端口的问题,而是应用程序的android客户端的问题。但我想不出有什么问题。 顺便说一下,当我试图发送消息时,运行客户端的手机和运行服务器的笔记本电脑都连接到了同一个网络。

  • 客户端应用程序在以下代码处挂起:

  • 问题内容: 我在ElastiCache上运行Redis集群。 多个进程连接到Redis集群。每个进程都位于Docker容器中。流程不尽相同-我有一个流程,一个流程等。 正常运行几天后,连接到Redis时,我的某些进程开始超时。当我进入受影响的容器并尝试通过到达群集时,与群集的连接超时。这告诉我,问题不仅影响过程,而且影响整个容器。 当我从任何其他容器中使用时,连接都不会出现问题。 我的进程会根据需

  • 我正在使用和NIO通道编写一个简单的NIO服务器。每次我有一个传入连接,我都使用以下代码向选择器注册它: 在客户端,因为我只有一个socketChannel,所以很容易关闭通道并使用选择器取消注册。然而,在服务器端,我所做的只是等待任何连接过的客户端(可能有数千个)的写操作。有什么方法可以检测到客户端已在服务器端断开连接?例如,10K连接后,选择器似乎会变得非常低效,其中大多数可能会在短时间内失效