我要做的是从客户端发送消息 - >服务器,然后发送回连接到服务器的每个其他客户端(多线程)。从不同的客户端发送到服务器工作正常,但当我尝试发回它时,没有任何反应。
每次有人连接时,它会在我的User []数组中创建一个新对象。有了它,我可以为每个用户触发输出流(用户在其中有一个Stream对象,其中包含输入和输出流,因此每次创建一个新的User对象时,新流也是如此。)
有了这个,我正在尝试将返回的消息发送给我的用户数组中的每个其他用户(不要== null)。
问题是,当我回到发送消息的部分时,我的User []数组中的所有用户都返回“null”。
Server.java:
package Main;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ForkJoinPool;
import Streams.Stream;
public class Server {
public static final int maxConnections = 10;
ServerSocket serverSocket; Socket socket;
ForkJoinPool pool = new ForkJoinPool();
static User[] users = new User[maxConnections];
public Server() {
try {
serverSocket = new ServerSocket(43594);
while(Stream.streams < maxConnections) {
socket = serverSocket.accept();
for(User user : users) {
if(user == null) {
user = new User(socket);
System.out.println(user +", 1");
pool.execute(user);
System.out.println("Someone has joined the chat!");
break;
} else {
System.out.println("Connection declined. Too many users.");
break;
}
}
}
}catch(IOException e) { e.printStackTrace(); }
}
public static void main(String[] args) {
new Server();
}
}
User.java:
package Main;
import java.io.IOException;
import java.net.Socket;
import Streams.Stream;
public class User implements Runnable {
Stream stream;
public User(Socket socket) {
stream = new Stream(socket);
}
public void run() {
String textInput, textOutput;
while(stream.exists()) {
try{
textInput = (String) stream.recieveData();
sendGlobalMessage(textInput);
}catch(IOException e) {
e.printStackTrace();
}catch(ClassNotFoundException e) { e.printStackTrace(); }
}
stream.close();
}
public void sendMessage(String message) throws IOException {
stream.sendData(message);
}
public void sendGlobalMessage(String message) throws IOException {
for(User user : Server.users) {
if(user == null) {
System.out.println(message);
}else{
user.sendMessage(message);
}
}
}
}
Stream.java:
package Streams;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;
public class Stream {
public static int streams = 0;
Socket socket;
ObjectInputStream input; ObjectOutputStream output;
Object data;
public Stream(Socket userSocket) {
streams++;
socket = userSocket;
try{
input = new ObjectInputStream(userSocket.getInputStream());
output = new ObjectOutputStream(userSocket.getOutputStream());
}catch(IOException e) { e.printStackTrace(); }
}
public void sendData(Object data) throws IOException {
output.writeObject(data);
output.flush();
}
public Object recieveData() throws IOException, ClassNotFoundException {
return data = input.readObject();
}
public boolean exists() {
if(socket.isClosed()) return false; else return true;
}
public void close() {
try {
input.close();
output.close();
socket.close();
}catch(IOException e) { e.printStackTrace(); }
}
}
我不确定它是否与我的服务器结构有关。它对我来说看起来很不错,我真的不确定它为什么会这样做。
答案 0 :(得分:4)
此处的User
引用是数组中引用的副本,而不是实际引用。
for(User user : users) {
if(user == null) {
user = new User(socket);
相当于
User user = user[i];
更改参考user
不会修改参考user[i]
。
您需要使用索引for循环来初始化(或重新引用)数组元素
for (int i = 0; i <users.lenght; i++) {
if(users[i] == null) {
users[i] = new User(socket);
} ...
...
}
答案 1 :(得分:2)
您无法使用for-each循环初始化List或数组中的项目。相反,你应该使用标准for循环。使用for-each循环,您将对象分配给临时变量,这对List项本身没有影响。