Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java套接字多个客户端不接收消息_Java_Sockets - Fatal编程技术网

java套接字多个客户端不接收消息

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

我正在制作一个java socket聊天程序,我使它兼容多个连接,当用户加入时,它不会发送消息“[user]Joined”对于所有的客户端,只针对连接的客户端,但我为每个客户端都有一个线程。如果有人能告诉我为什么它只向最近加入的用户发送消息,我将不胜感激。这是服务器代码

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