java - 监听多个输入流?

标签 java io inputstream

我正在用 Java 制作一个聊天程序,其风格与 MSN 等 IM 程序一样。现在,我的程序将不会像 MSN 那样拥有丰富的功能,我也不会深入研究广泛的 GUI 设计。

我遇到的问题是,我可能会采用错误的设计来做到这一点。

我目前正在设计一个 session 对象。基本上,用户与服务器联系并处于“不确定”状态,直到他们决定邀请某人聊天。然后是服务器的工作(尚未到达该部分)在涉及的用户之间建立 session 。

我的问题是,我必须监听多个输入流中的变化并相应地更新每个人的显示。我如何设法监听所有输入流并在其中一个“向 session 发送消息”时进行更新?

这是到目前为止我的代码。时间不是很长。

包服务器;

import java.io.*;
import java.util.Scanner;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
 *
 * @author Vipar
 */
public class Session implements Runnable {
    private static User[] users;
    private static PrintWriter[] outputs;
    private int sessionId;

    public Session(User[] users) {
        this.users = users;
        outputs = new PrintWriter[users.length];
        sessionId = this.hashCode();

        try {
            for(int i = 0; i < users.length; i++) {
            outputs[i] = new PrintWriter(users[i].getSocket().getOutputStream(), true);
            }
        } catch (IOException ioe) {
            ChatServer.print("An error occured in session " + sessionId);
            ChatServer.print(ioe.getMessage());
        }
    }

    @Override
    public void run() {
        ChatServer.print("SessionId: " + sessionId + " have initiated.");
        ExecutorService service = Executors.newFixedThreadPool(users.length);
        for(int i = 0; i < users.length; i++) {
            service.submit(new InputStreamListener(users[i]));
        }
        do {
            if(users.length < 2) {
                ChatServer.print("SessionId: " + sessionId + " have ended.");
                break;
            }
        } while(true);
    }

    public static void update(User u, String message) {
        for(int i = 0; i < users.length; i++) {
            outputs[i].println("new");
            outputs[i].println(u.getUserName());
            outputs[i].println(message);
        }
    }
}

我刚刚制作的InputStreamListener:

package server;

import java.util.Scanner;
import java.io.*;
import java.util.NoSuchElementException;

/**
 *
 * @author Vipar
 */
public class InputStreamListener implements Runnable {
    private Scanner scanner;
    private User user;
    public InputStreamListener(User user) {
        this.user = user;
        try {
            scanner = new Scanner(user.getSocket().getInputStream());
        } catch (IOException ioe) {
            ChatServer.print("An Error occured for the InputStream: "
                    + user.getUserName());
            ChatServer.print(ioe.getMessage());
        }

    }

    @Override
    public void run() {
        String s = "";
        do {
            try {
                s = scanner.nextLine();
                Session.update(user, s);
            } catch(NoSuchElementException e) {
                continue;
            }
        } while(!s.equals("/DISCONNECT"));
        try {
            user.getSocket().close();
        } catch(IOException ioe) {
            ChatServer.print("Problem closing users InputStream: "
                    + user.getUserName());
            ChatServer.print(ioe.getMessage());
        }
    }
}

最佳答案

最简单的方法是为每个客户端使用一个线程。每个线程从自己的输入流中读取并通知 session 有关新消息的信息。这样的线程还可以知道如何将消息发送回客户端。 如果您期望有很多客户端,您可以尝试比线程更轻量级的东西,例如 actor(例如 Akka )。或者尝试将异步 IO 与 NIO 结合使用。

关于java - 监听多个输入流?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12795295/

相关文章:

java - hadoop 2.5.0 启动datanode失败

java - play framework接收paypal IPN请求

java - 如何从字符串转换为 Epoch 微秒?

powershell - 在Powershell中显示文件的实时内容

java - 扫描仪在使用 next() 或 nextFoo() 后跳过 nextLine()?

java - Android 中的 PNG 图像和 InputStream

java - 缓冲读取器未从套接字接收数据

java - ActiveMQ 故障转移 : How to set the maximum reconnect delay

java - 将二进制文件读入字符串

java - 读取 ClassLoader.getSystemResourceAsStream 后是否需要显式关闭输入流?