編集:Socket[] array = new Socket[#];
配列を初期化することはありません。それが問題かもしれません。ただし、 aList
または a のいずれかを使用することをお勧めしますMap
。どうやら、ソケットを後でプロパティ (名前または ID) で取得できるように格納したいと思われます。この場合、 をキーとして、値として をHashMap
使用することをお勧めします。これは、使用でき、必要なソケットを返します。Integer
Socket
map.get(ID);
HashMap を使用してみてください。おそらく、現在接続している人数の var を使用できます。誰かがログインしたら、次のようにします
public class Serer {
HashMap<Integer, Socket> list = new HashMap<Integer, Socket>();
static final int maxConnections = 100;
static int currentConnections = 0;
public Server() {
try {
ServerSocket socket = new ServerSocket(/*port#*/, maxConnections);
}catch(IOException e) { }
}
public void acceptConnections() {
while(currentConnections < maxConnections) {
list.put(currentConnections++, serversocket.accept());
}
}
public Socket getSocket(int ID) {
return list.get(ID);
}
public static void main(String[] args) {
new Server().acceptConnections();
}
これはテストされていないため、「acceptConnections」をスレッドに配置することを強くお勧めします。これにより、while ループがコードを保持しなくなります。例外は見つかりませんでしたがHashMap
、ソケットを保持するためにa を使用する方法を理解していただければ幸いです。
ここで、すべてのソケットにデータを送信したい場合は、ソケットOutputStream
ごとに を作成する必要があります。クラス( などUser.java
)を作成し、誰かが接続したら、新しいユーザーを作成してソケットに渡すことをお勧めします。
while(true) {
new User(ss.accept());
}
次に、あなたの中にUser.java
、次のようなものがあります:
public class User {
ObjectOutputStream out;
ObjectInputStream in;
Socket socket;
public User(Socket socket) {
this.socket = socket;
initStream();
startChat();
}
public void initStream() {
try{
out = new ObjectOutputStream(socket.getOutputStream());
in = new ObjectInputSTream(socket.getInputStream());
}catch(IOException e) { }
}
public void startChat() {
new Thread(new Runnable() {
public void run() {
String input;
try {
while((input = (String) in.readObject) != null) {
//this loop only triggers when something is retrieved through the input stream
Server.sendGlobalMessage(input); //can be done in different ways
//The reason why I call this statically from Server.java is because Server.java
//is the class that contains the HashMap, but that's up to you of where to put it.
//You could make the `HashMap` static, and make the sendGlobalMessage() in User.java
}
}catch(IOException | ClassNotFoundException e) { }
};).start();
}
最後に、sendGlobalMessage については、 を使用するかIterator
、ハッシュマップを配列に変換する必要があります。HashMap
このコードは、ソケットに を使用する代わりに、ソケットを User クラスに渡し、 を使用しHashMap
てユーザーを格納することを前提としています。(出力ストリームへのアクセスが必要です)
HashMap<Integer, User> list = new HashMap<Integer, User>();
public static void sendGlobalMessage(String message) {
for(User user : list.values().toArray(new User[list.size]) {
try {
user.out.writeObject(message);
user.out.flush();
}catch(IOException | ClassNotFoundException e) { }
}
}