簡體   English   中英

Java套接字多個客戶端未收到消息

[英]java socket multiple clients not receiving messages

我正在制作一個Java套接字聊天程序,並且使它兼容多個連接,並且當用戶加入時,它不會將“ [用戶加入””的消息發送給所有連接的客戶端,但是我有一個線程客戶,如果有人可以告訴我為什么它只向最近加入的用戶發送消息,我將不勝感激。 這是服務器代碼

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

因此,每次有人連接到服務器時,您都要創建一個新的EchoThread。 每個用戶都有自己的EchoThread。

您的服務器角色是管理所有EchoThreads和套接字。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM