java - 有没有办法将所有 ObjectOutputStream 连接到一个输入流?
问题描述
我有一个Client
类和一个类,它们通过sMessageServer
相互通信。Socket
他们互相发送Message
对象(尚未实现)。
问题是,在我的 MessageServer 类中,我有一个这样的实现
LinkedList<Client> clients = new LinkedList<>();
LinkedList<ObjectOutputStream> outs = new LinkedList<>();
LinkedList<ObjectInputStream> ins = new LinkedList<>();
但是这种方法似乎很奇怪,而且我越想越没用。
我想Message
从 1 个输出流中获取对象,因为这样,我不必遍历每个OOS
对象来找出哪个客户端实际将对象放入流中。
我错了吗?我应该如何接近?
消息服务器
public class MessageServer extends Server implements Runnable{
static LinkedList<Message> messages = new LinkedList<>();
LinkedList<Client> clients = new LinkedList<>();
LinkedList<ObjectOutputStream> outs = new LinkedList<>();
LinkedList<ObjectInputStream> ins = new LinkedList<>();
ExecutorService threads = Executors.newFixedThreadPool(3);
ExecutorService clientThreads = Executors.newCachedThreadPool();
public MessageServer() throws IOException {
super(Vars.MESSAGE_PORT);
}
//Accept the connetions to the server
private class ServerConnection implements Runnable{
@Override
public void run(){
while (true) {
try {
Socket client = serverSocket.accept();
//Read Client data then add to the list
ObjectOutputStream out = new ObjectOutputStream(client.getOutputStream());
ObjectInputStream in = new ObjectInputStream(client.getInputStream());
outs.add(out);
ins.add(in);
Client current = (Client) in.readObject();
if(current.getType()) {
Provider p = (Provider) current;
clients.add(p);
}else{
Receiver r = (Receiver) current;
clients.add(r);
}
} catch (IOException | ClassNotFoundException ex) {
Logger.getLogger(MessageServer.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
}
private class ServerIO implements Runnable{
@Override
public void run(){
}
}
public void addToMessages(Message message) {
if (!messages.contains(message)) {
messages.add(message);
}
}
@Override
public void run() {
threads.execute(new ServerConnection());
threads.execute(new ServerIO());
}
}
Provider
和Receiver
类是 类 的子类,Client
它们用于将来的视频流并且现在以相同的方式运行。
信息
public class Message implements Serializable {
private final int maxChar = 250;
private String content;
private String timeStamp;
private Client sender;
public Message(Client sender, String content, String timeStamp) {
this.sender = sender;
this.content = content;
this.timeStamp = timeStamp;
}
}
客户
public class Client implements Serializable {
protected String nickname;
protected long id;
protected int key;
/*
* True -> Provider
* False -> Receiver
*/
protected boolean type;
// MessageServer
protected transient ObjectOutputStream msgOut;
protected transient ObjectInputStream msgIn;
protected transient Socket messageSocket;
protected transient Socket videoSocket;
public Client(String nickname, boolean type){
this.type = type;
this.nickname = nickname;
createid();
makeConnection();
key = (int) (Math.random() * 8999) + 1000;
}
void makeConnection(){
try {
messageSocket = new Socket(Vars.IP, Vars.MESSAGE_PORT);
//TODO make connection with videoServer
msgOut = new ObjectOutputStream(messageSocket.getOutputStream());
msgIn = new ObjectInputStream(messageSocket.getInputStream());
msgOut.writeObject(this);
} catch (IOException ex) {
Logger.getLogger(Client.class.getName()).log(Level.SEVERE, null, ex);
}
}
解决方案
推荐阅读
- angular - 为什么即使我添加了 takeUntil 和 skipWhile,ngrx 也会返回 2 个对象?
- javascript - 你能取消初始化一个javascript函数吗?
- c# - 是否可以将 WPF 数据网格上的用户输入数据存储到字符串 var 中?
- python - 在 Python 中的 If 语句中删除对象
- node.js - Akka 演员与 nodejs 工作线程。为什么(如果)演员更好?
- c++ - 如何在 Windows 上的 C++ 中通过蓝牙实现串行通信?
- java - jooq 嵌套选择和类型安全
- c# - 重写以下方法的更好方法
- powershell - 非域帐户或本地用户帐户的凭据检查
- git - 如何在git中推送到正确的分支