Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/364.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_Client_Broadcast - Fatal编程技术网

Java 套接字编程:广播功能仅发送到一个客户端

Java 套接字编程:广播功能仅发送到一个客户端,java,sockets,client,broadcast,Java,Sockets,Client,Broadcast,我正在创建一个程序,其中多个客户端可以连接到服务器。客户端发送的消息将广播到服务器上的所有其他客户端连接 我的问题是,消息只广播给它来自的客户端,我无法发现代码中的错误 谁能帮我找出问题所在,或者我如何改进代码?谢谢 编辑: broadcast()方法在哪里 您正在服务器中创建两组流。accept循环不应该创建任何流或执行任何I/O。所有这些都应该在处理连接的线程中完成 这里根本不需要ObjectInput/OutputStreams 当您在套接字上获得除读取超时以外的任何IOException

我正在创建一个程序,其中多个客户端可以连接到服务器。客户端发送的消息将广播到服务器上的所有其他客户端连接

我的问题是,消息只广播给它来自的客户端,我无法发现代码中的错误

谁能帮我找出问题所在,或者我如何改进代码?谢谢

编辑:

  • broadcast()
    方法在哪里

  • 您正在服务器中创建两组流。accept循环不应该创建任何流或执行任何I/O。所有这些都应该在处理连接的线程中完成

  • 这里根本不需要
    ObjectInput/OutputStreams

  • 当您在套接字上获得除读取超时以外的任何
    IOException
    时,必须将其关闭。您还应该打印出异常自己的消息,而不仅仅是编写自己的消息


  • 另一个问题出现在
    MsgClient
    code中:

    cmdInput = keyboard.readLine();
    output.writeUTF(cmdInput);
    System.out.println(sInput.readUTF());
    

    客户端在发送消息之前不会收到消息。

    您能发布更多信息吗?现在还不清楚你的类有多少个实例,以及每个实例是否都有自己的
    socketVector
    。我猜你遇到了一个你忽略的异常,或者你的客户端没有异步读取套接字。您好,我已经编辑了这篇文章,其中包含了我用于解决这个问题的三个类文件。
    public class MsgServer {
    
    
    public MsgServer(int PORT) throws IOException{
    
        ServerSocket server = new ServerSocket(PORT);
        System.out.println("Server Established...");
    
    
        while(true){
    
            Socket client = server.accept();
    
            DataInputStream input = new DataInputStream(client.getInputStream());
            ObjectOutputStream oo = new ObjectOutputStream(client.getOutputStream());
            DataOutput output = new DataOutputStream(client.getOutputStream());
    
            System.out.println("New client accepted");
    
            String clientName = input.readUTF();
            ClientHandler handler = new ClientHandler(clientName, client);  // construct and run thread.
    
            handler.start();
            System.out.println("Handler started!");
    
        }//end while
    
    }//end of constructor
    
    
    public static void main(String args[]) throws IOException {
        if(args.length != 1)
            throw new RuntimeException("Syntax: java MsgServer requires <PORT> number");
        new MsgServer(Integer.parseInt(args[0]));
    }
    
    public class ClientHandler extends Thread {
    
    Socket client;
    DataInputStream din;
    DataOutputStream dout;
    String name;
    
    String clientMsg;
    
    protected static Vector socketVector = new Vector();
    
    
    public ClientHandler (String name, Socket client) throws IOException{
        this.name = name;
        this.client = client;
        din = new DataInputStream(client.getInputStream());
        dout = new DataOutputStream(client.getOutputStream());
    }
    
    // Code run at every start()
    public void run(){
        try{
            socketVector.addElement(this);      
            clientMsg = din.readUTF(); // inside or outside loop?
    
            while(true){
                broadcast( name + " has joined auction on IP " + client.getInetAddress());
                broadcast( name + " says: " + clientMsg);
            }
    
        } catch(IOException ex){
            System.out.println("-- Connection to user lost");
        } finally{
            socketVector.removeElement(this);
            broadcast(name + " has left");
            try{
                client.close();
            }catch (IOException ex){
                System.out.println("socket to user already closed?");
            }
        }
    }
    
    cmdInput = keyboard.readLine();
    output.writeUTF(cmdInput);
    System.out.println(sInput.readUTF());