gpt4 book ai didi

java - 阻塞网络任务的问题

转载 作者:行者123 更新时间:2023-11-30 11:59:05 24 4
gpt4 key购买 nike

我是 Java 新手,所以请原谅我可能犯的任何下流错误:)

我正在用 Java 开发一个程序,除其他外,它还应该处理将连接到服务器的客户端。服务器有 3 个线程在运行,我是通过以下方式创建它们的:

DaemonForUI du;
DaemonForPort da;
DaemonForCheck dc;

da = new DaemonForPort(3);
dc = new DaemonForCheck(5);
du = new DaemonForUI(7);

Thread t_port = new Thread(da);
Thread t_check = new Thread(dc);
Thread t_ui = new Thread(du);

t_port.setName("v1.9--PORTd");
t_check.setName("v1.9-CHECKd");
t_ui.setName("v1.9----UId");

t_port.start();
t_check.start();
t_ui.start();

每个线程处理整个程序的不同方面。线程 t_ui 负责接受来自客户端的异步传入连接,处理发送的数据并将其他数据发送回客户端。当我从上一段代码中删除与 t_ui 线程有关的所有命令时,一切运行正常,在我的例子中这意味着其他线程正在打印它们的调试消息。

如果我也将 t_ui 线程设置为运行,那么整个程序将在 t_ui 线程的“接受”处阻塞。

阅读在线手册后,我看到接受的连接应该是非阻塞的,因此使用类似的东西:

public ServerSocketChannel ssc = null;

ssc = ServerSocketChannel.open();
ssc.socket().bind(new InetSocketAddress(port));
ssc.configureBlocking(false);

SocketChannel sc = ssc.accept();

if (sc == null) {
;
}
else {
System.out.println("The server and client are connected!");
System.out.println("Incoming connection from: " + sc.socket().getRemoteSocketAddress());
in = new DataInputStream(new BufferedInputStream(sc.socket().getInputStream()));
out = new DataOutputStream(new BufferedOutputStream(sc.socket().getOutputStream()));
//other magic things take place after that point...

t_ui 的线程创建如下:

class DaemonForUI implements Runnable{
private int cnt;
private int rr;
public ListenerForUI serverListener;

public DaemonForUI(int rr){
cnt = 0;
this.rr = rr;
serverListener = new ListenerForUI();
}

public static String getCurrentTime() {
final String DATE_FORMAT_NOW = "yyyy-MM-dd HH:mm:ss";
Calendar cal = Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT_NOW);
return (sdf.format(cal.getTime()));
}


public void run() {
while(true) {
System.out.println(Thread.currentThread().getName() + "\t (" + cnt + ")\t (every " + rr + " sec) @ " + getCurrentTime());
try{
Thread.sleep(rr * 1000);
cnt++;
}
catch (InterruptedException e){
e.printStackTrace();
}
}
}
}

显然,我在创建套接字或使用线程时做错了。您知道导致问题的原因吗?

我们将不胜感激。

最佳答案

除非你知道你需要它,否则不要使用非阻塞 I/O。只需为每个接受的套接字以及接受线程启动一个新线程。

关于java - 阻塞网络任务的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2722324/

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