[英]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.