【问题标题】:java socket multiple clients not receiving messagesjava socket多个客户端不接收消息
【发布时间】:2017-06-28 17:58:37
【问题描述】:

我正在制作一个 java 套接字聊天程序,并且我使它与多个连接兼容,当用户加入时,它不会向所有客户端发送消息“[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();
}
}

【问题讨论】:

    标签: java sockets


    【解决方案1】:

    所以, 每次有人连接到服务器时,你都会创建一个新的 EchoThread。 每个用户都有自己的 EchoThread。

    您的服务器角色是管理所有 EchoThreads 和 Sockets。

     output.writeObject(s.getInetAddress() + " Connected");
    

    这只会向一个用户发送消息。 您的服务器应该有一个 Sockets 列表并向每个 Sockets 发送消息

    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();
                }
            }
        }
    }
    

    【讨论】:

    • 我将它添加到我的代码中,它只是将消息发送给用户列表的长度,因此如果列表长度为 7,它将向我发送相同的消息 7 次
    • 只是一个小错误^^它是“s.getInetAdress”,而不是socket.getInetAdress“:)
    • 它仍然没有将消息发送给所有用户
    • 是的,对不起,我读得很快^^您的“输出”使用了错误的套接字。 “输出 = 新 ObjectOutputStream(sock.getOutputStream());”而且你不应该向 EchoThread 类中的所有用户发送消息,而是在 Server 类中。在 Server 类中创建方法“sendMessage(String s)”
    • 你也可以在服务器中有一个ArrayList
    猜你喜欢
    • 2012-02-12
    • 2017-02-13
    • 1970-01-01
    • 2010-12-03
    • 2016-05-27
    • 2010-09-23
    • 1970-01-01
    • 2013-04-24
    • 1970-01-01
    相关资源
    最近更新 更多