gpt4 book ai didi

java - 服务器应用程序挂起 Java 套接字编程

转载 作者:行者123 更新时间:2023-12-02 11:11:28 26 4
gpt4 key购买 nike

我的应用程序不断加载(圆形光标)。这是我的代码

public class ControllerW {

@FXML
private Label statusLbl, timeLbl, textLbl;
@FXML
private Button exitBtn, linkBtn;

private ServerSocket serverSckt;
private Socket clientSckt;
DataInputStream dis;
String text;

@FXML
private void exit() {
System.exit(0);
}

@FXML
private void linkAndroid() {
try {
serverSckt = new ServerSocket(5678);
statusLbl.setText("Server started");
clientSckt = serverSckt.accept();
statusLbl.setText("client connected successfully");
dis = new DataInputStream(clientSckt.getInputStream());
text = dis.toString();
textLbl.setText(text);
} catch (Exception e) {
statusLbl.setText("No connection on port 5678");
e.printStackTrace();
}
}

}

我是套接字编程的新手,如果我的代码有任何问题,有人可以帮助我

最佳答案

您的应用程序正在停止响应,因为它没有线程化。如果没有多线程,您的应用程序将在您单击“链接”按钮时“停止”,因为对 ServerSocket#accept 的调用.

其原因是 accept 方法的阻塞本质。在另一个套接字连接之前,ServerSocket 正在等待并保持当前线程“挂起”。将其视为类似于以下的内部 while 循环:

while(!isConnected())
{
// check if there is a new request
}

想象一下没有客户端会连接。这个循环怎么会停止呢?从来没有。

一个可能的解决方法是对整个 UI 部分或“数据模型”部分进行线程化。

我首选的方法是创建一个自定义类,该类仅处理 ServerSocket#accept 方法,并将传入连接委托(delegate)给另一个线程,由该线程负责其余的工作。我这样做是为了让我的服务器随时可访问,这可能不是解决您的问题的最佳方法。

这就是我的助手类通常的样子:

ClientAccepter.java:

public class ClientAccepter
implements Runnable
{
// the ServerSocket
private final ServerSocket server;
// ExecutorServices ease the pain of threading your application quite a lot
private final ExecutorService es = Executors.newCachedThreadPool();

private boolean isAlive = true;

public ClientAccepter( ServerSocket server )
{
this.server = server;
}

@Override
public void run()
{
//This is where you specify your desired behaviour.
//Example:
while ( isAlive )
{
try
{
es.execute( new ClientHandler( server.accept() ) );
}
catch ( IOException e )
{
e.printStackTrace();
}
}
}
}

对此类的调用可能如下所示:

服务器.java:

public class Server
{
//ExecutorServices are the best and easy to use.
private static ExecutorService serverThreader = Executors.newSingleThreadExecutor();

public static void main( String[] args )
{
try
{
serverThreader.execute( new ClientAccepter( new ServerSocket( 8080 ) ) );
}
catch ( IOException e )
{
e.printStackTrace();
//further exception handling.
}
}
}

公平地说,这可能不是最好的方法,但它是我处理阻塞操作的首选方法。您应该考虑通过 orcale concurrency tutorial 进行工作一定要看看ExecutorServices因为它们是一个令人难以置信的框架,可以轻松处理线程池。

<小时/>

还有专门针对 JavaFX 的 concurrency tutorial .

关于java - 服务器应用程序挂起 Java 套接字编程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50596541/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com