java套接字多个客户端不接收消息
我正在制作一个java socket聊天程序,我使它兼容多个连接,当用户加入时,它不会发送消息“[user]Joined”对于所有的客户端,只针对连接的客户端,但我为每个客户端都有一个线程。如果有人能告诉我为什么它只向最近加入的用户发送消息,我将不胜感激。这是服务器代码java套接字多个客户端不接收消息,java,sockets,Java,Sockets,我正在制作一个java socket聊天程序,我使它兼容多个连接,当用户加入时,它不会发送消息“[user]Joined”对于所有的客户端,只针对连接的客户端,但我为每个客户端都有一个线程。如果有人能告诉我为什么它只向最近加入的用户发送消息,我将不胜感激。这是服务器代码 import java.io.*; import java.net.*; import java.util.ArrayList; public class server { public ObjectInputStream i
import java.io.*;
import java.net.*;
import java.util.ArrayList;
public class server {
public ObjectInputStream input;
public ServerSocket server;
public Socket s;
public ObjectOutputStream output;
public ArrayList<Socket> users = new ArrayList<Socket>();
public class Accept implements Runnable {
public void run() {
try {
server = new ServerSocket(55555, 100);
} catch (IOException e) {
e.printStackTrace();
}
while(true) {
try {
s = server.accept();
users.add(s);
new EchoThread(s).start();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
public class EchoThread extends Thread {
private Socket sock;
public EchoThread(Socket s) throws IOException {
this.sock = s;
output = new ObjectOutputStream(sock.getOutputStream());
}
public void run() {
System.out.println(sock.getInetAddress() + " Connected");
try {
for(Socket s: users) {
output.writeObject(s.getInetAddress() + " Connected");
}
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
server() throws IOException {
Thread t = new Thread(new Accept());
t.start();
}
public static void main(String[] args) throws IOException {
new server();
}
}
import java.io.*;
导入java.net。*;
导入java.util.ArrayList;
公共类服务器{
公共对象输入流输入;
公共服务器套接字服务器;
公共插座;
公共对象输出流输出;
public ArrayList users=new ArrayList();
公共类接受实现可运行{
公开募捐{
试一试{
服务器=新服务器套接字(55555100);
}捕获(IOE异常){
e、 printStackTrace();
}
while(true){
试一试{
s=server.accept();
用户。添加;
新的EchoThread.start();
}捕获(IOE异常){
e、 printStackTrace();
}
}
}
}
公共类EchoThread扩展线程{
私人插座;
公共EchoThread(套接字)引发IOException{
this.sock=s;
output=newObjectOutputStream(sock.getOutputStream());
}
公开募捐{
System.out.println(sock.getInetAddress()+“已连接”);
试一试{
用于(套接字s:用户){
writeObject(s.getInetAddress()+“已连接”);
}
}捕获(IOE1异常){
e1.printStackTrace();
}
}
}
服务器()抛出IOException{
线程t=新线程(new Accept());
t、 start();
}
公共静态void main(字符串[]args)引发IOException{
新服务器();
}
}
所以,
每次有人连接到服务器时,你都会创建一个新的EchoThread。
每个用户都有自己的EchoThread
您的服务器角色是管理所有EchoThreads和Socket
output.writeObject(s.getInetAddress() + " Connected");
这只向一个用户发送一条消息。
您的服务器应该有一个套接字列表,并向每个套接字发送消息
public ArrayList<Socket> users = new ArrayList<Socket>();
public ArrayList<ObjectOutputStream> outputs = new ArrayList<ObjectOutputStream>();
public class Accept implements Runnable {
public void run() {
try {
server = new ServerSocket(55555, 100);
} catch (IOException e) {
e.printStackTrace();
}
while(true) {
try {
s = server.accept();
users.add(s);
outputs.add(new ObjectOutputStream(s.getOutputStream()));
for (ObjectOutputStream o: outputs) {
o.writeObject(s.getInetAddress() + " has connected");
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
public ArrayList users=new ArrayList();
public ArrayList outputs=new ArrayList();
公共类接受实现可运行{
公开募捐{
试一试{
服务器=新服务器套接字(55555100);
}捕获(IOE异常){
e、 printStackTrace();
}
while(true){
试一试{
s=server.accept();
用户。添加;
add(新的ObjectOutputStream(s.getOutputStream());
for(ObjectOutputStream o:outputs){
o、 writeObject(s.getInetAddress()+“已连接”);
}
}捕获(IOE异常){
e、 printStackTrace();
}
}
}
}
我将其添加到我的代码中,它只会向用户发送消息,告知列表有多长,因此如果列表有7长,它会向我发送7次相同的消息,只是有一点错误^^^^它是“s.GetInetAddress”,而不是socket.GetInetAddress:)它仍然不会向所有用户发送消息。对不起,我已经读取到fast^^您的“输出”“与错误的插座连接。“output=newObjectOutputStream(sock.getOutputStream());”并且您不应该向EchoThread类中的所有用户发送消息,而应该向Server类中的所有用户发送消息。在服务器类中创建一个方法“sendMessage(String s)”。在服务器中还可以有一个ArrayList