编辑:Socket[] array = new Socket[#];
你永远不会初始化你的数组。这可能是问题所在。但我建议使用 aList
或 a Map
。显然,我猜你想以一种以后可以通过属性(名称或 ID)检索它的方式存储套接字。在这种情况下,我建议使用HashMap
,Integer
作为它们Socket
的键和值。这是,你可以使用map.get(ID);
,它会返回你想要的套接字。
您可以尝试使用 HashMap,也许有一个变量来表示当前连接的人数。当有人登录时,请执行以下操作
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 循环就不会阻止您的代码。我没有发现任何异常,但希望这会让您了解使用 aHashMap
来保存您的套接字
现在,如果您想向所有套接字发送数据,则需要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 转换为一个数组。这段代码假设您不使用HashMap
for 套接字,而是将套接字传递给 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) { }
}
}