簡體   English   中英

聽多個InputStreams?

[英]Listen to multiple InputStreams?

我正在用MSN之類的IM程序制作Java聊天程序。 現在,我的程序不會像MSN那樣具有那么多的功能,我也不會涉足廣泛的GUI設計。

我的問題是,我可能會選擇錯誤的設計來執行此操作。

我目前正在設計一個Session對象。 基本上,用戶與服務器建立聯系並保持“ limbo”狀態,直到他們決定邀請某人進行聊天為止。 然后是服務器工作(尚未完成該部分)在所涉及的用戶之間建立會話。

我的問題是,我必須偵聽多個InputStream中的更改並相應地更新每個人的顯示。 當其中一個向會話“發送消息”時,我如何設法監聽所有InputStream並進行更新?

到目前為止,這是我的代碼。 時間不長

包服務器;

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());
        }
    }
}

最簡單的方法是為每個客戶端使用一個線程。 每個線程從其自己的InputStream讀取並向會話通知新消息。 這樣的線程還可以知道如何將消息發送回客戶端。 如果您期望有很多客戶,則可以嘗試比線程更輕量的東西,例如actor(例如Akka )。 或者嘗試將異步IO與NIO結合使用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM