首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在java中使用tcp向所有客户端广播消息

如何在java中使用tcp向所有客户端广播消息
EN

Stack Overflow用户
提问于 2016-07-28 00:59:56
回答 1查看 9.5K关注 0票数 0

我正在构建一个多线程聊天服务器应用程序,该应用程序将一个客户端发送的消息广播到所有clients.On,大多数示例都在互联网上和甲骨文的网站上进行,也是使用udp (多播套接字)广播的,但我使用的是tcp。有人知道如何在tcp连接中向所有连接的客户端发送消息吗?下面是我当前的代码,它运行良好,只将从客户端接收到的消息发送给该客户端:

EchoServer

代码语言:javascript
复制
import java.net.*;
import java.io.*;

public class EchoServer 
{
    public static void main(String[] args)
        throws IOException
    {
        if (args.length != 1) {
            System.err.println("Usage: java EchoServer <port number>");
            System.exit(1);
        }

        int portNumber = Integer.parseInt(args[0]);

        ServerSocket serverSocket = new ServerSocket(Integer.parseInt(args[0]));

        while (true) {
            try {
                Thread t = new Thread(new MultiServer(serverSocket.accept()));
                t.start();
            } catch(IOException e) {
                System.out.println("Accept Failed:");
                System.exit(-1);
            }
        }
    }
}

EchoClient

代码语言:javascript
复制
import java.io.*;
import java.util.Scanner;
import java.net.*;

public class EchoClient 
{
    public static void main(String[] args) throws IOException 
    {
        if (args.length != 2) {
            System.err.println("Usage: java EchoClient <host name><portnumber>");
            System.exit(1);
        }

        String hostName = "localhost";

        int portNumber = Integer.parseInt(args[1]);

        try (
            Socket echoSocket = new Socket(hostName, portNumber);
            PrintWriter out = new PrintWriter(echoSocket.getOutputStream(), true);
            BufferedReader in = new BufferedReader(new InputStreamReader(echoSocket.getInputStream()));
            BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in));
        ) {
            String userInput;

            while ((userInput = stdIn.readLine()) != null)  {
                out.println(userInput);
                System.out.println("echo::" + in.readLine());
            }
        } catch (UnknownHostException e) {
            System.err.println("Don't know about host " + hostName);
            System.exit(1);
        } catch (IOException e) {
            System.err.println("Couldn't get I/O for the connection to " + hostName);
            System.exit(1);
        } 
    }
}

MultiServer

代码语言:javascript
复制
import java.io.*;
import java.net.*;

public class MultiServer implements Runnable
{
    private Socket client;

    public MultiServer(Socket m)
    {
        this.client = m;
    }

    @Override
    public void run()
    {
        BufferedReader in = null;
        PrintWriter out = null;
        try {
            out = new PrintWriter(client.getOutputStream(), true);
            in = new BufferedReader(new InputStreamReader(client.getInputStream()));
        } catch(IOException ignored) {
        }

        while (true) {
            String line;
            try {
                while ((line = in.readLine()) != null)
                    out.println(line);
            } catch (IOException e) {
                System.out.println("Read Failed");
                System.exit(-1);
            }
        }
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-07-28 04:51:22

使用并发hashmap并在其中维护客户端列表。并发hashmap是安全的,在添加/迭代/删除时不需要使用同步

代码语言:javascript
复制
// Create and main list of active clients based on their host name / ip address
ConcurrentHashMap<String, Socket> activeClients = new ConcurrentHashMap<String, Socket>();

// message received
activeClients.put(clientsocket.getInetAddress().getHostAddress(), clientsocket);

// broadcast message to all available clients
for(String clientHost : activeClients.keySet()) {
      // get each socket here and send a message to them.
}

向量基本上是线程安全的,所以您不需要担心这个问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38625500

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档