当前位置: 首页 > 知识库问答 >
问题:

Java服务器与客户端的通信

梁韬
2023-03-14

现在我的ServerSocket是这样的

public class Main {

    public static void main(String[] args) {
        Server server = new Server(9008);
    }
}

public class Server {

    private ServerSocket server;
    private Socket client;
    private ArrayList<ClientConnection> clientList;

    public Server(int port) {
        try {
            // Create out server with our desired port
            server = new ServerSocket(port);
            // Server started, let the user know
            System.out.println("Server started at port " + port + "...");
        } catch (IOException e) {
            // Unable to start server, print error
            System.out.println("Unable to start server on port " + port + "...");
        } 
        // Start our main server method
        runServer();
    }

    public void runServer() {
        clientList = new ArrayList<>();
        while (true) {
            try {
                // Wait for new clients and accept them
                client = server.accept();
                // Let the user know - print
                System.out.println("New user connected - " + client.getLocalAddress().getHostAddress());
                // Start thread for our client
                ClientConnection getClient = new ClientConnection(client);
                clientList.add(getClient);
                Thread clientThread = new Thread(getClient);
                clientThread.start();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

public class ClientConnection implements Runnable {

    private Socket socket;

    public ClientConnection(Socket client) {
        // Set client socket
        this.socket = client;
    }

    public void run() {
        try {
            // Read from our client input
            BufferedReader readClient = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            String line;
            while ((line = readClient.readLine()) != null) {
                // Print client message
                System.out.println("Client says - " + line);
            }
        } catch(IOException e) {

        }
    }
}

一切正常,客户端连接,发送一些数据,服务器读取它,但我的问题是如何从我的服务器发送消息到所有的客户端?我目前保存客户端上的ArrayList,所以我可以只是循环,ArrayList打开一个作家和刷新它,但我想发送的数据,我得到我的ClientConnection类

我应该如何处理这个代码?在服务器类上完成的所有操作?或

共有1个答案

慕项明
2023-03-14

不要说得太具体,但您可能应该看看观察者模式。

当一个新的客户端连接到服务器并且您创建了ClientConnection实例时,它可以被处理消息的另一个类观察到。这样,当客户端发送消息并且ClientConnection处理它时,它会自动将消息传输到处理消息传递功能并了解所有连接的类,然后该类将消息传输到所有客户端。

  1. 使ClientConnection实现可观察接口(或扩展可观察类以获得更方便的使用)
  2. makeServer实现了观察者界面,这样它就可以观察到可观察的东西。
  3. 当客户端连接时,创建一个新的ClientConnection并使Server监听它(add观察员()
  4. 当客户端发送新消息时,使ClientConnection执行setChanged()通知观察员
  5. 这样服务器就会注意到(通过它应该实现的更新方法)新消息,以及是哪个ClientConnection发送了它。
  6. 服务器现在遍历其所有客户端并将消息发送给每个客户端

见观察者和观察者,这应该足够了。如果没有,网上有一大堆关于观察者模式的文章。

 类似资料:
  • 我有这个代码可以在eclipse中与android Studio中的客户端通信服务器,我使用套接字,客户端向服务器发送消息,服务器读取该消息并确定一切正常,但当服务器向客户端发送消息时,客户端不强制任何东西;这是代码 还有这个 此代码是服务器代码的一部分,如果您需要客户端代码(Android Studio),请告诉我。 我需要帮助拜托

  • 我试图了解服务器-客户端网络如何为实时多人游戏工作。 假设我正在构建一个实时多人游戏,比如FPS。 如果玩家A向玩家B开枪,后端< code >服务器需要告诉玩家B他们被击中了。 我知道如何让玩家 A 告诉后端服务器他开了一枪,只是向服务器发送请求,但是如何让后端告诉玩家 他们被枪杀了? 玩家B是否必须每0.1秒检查一次后端以查看是否发生了什么事情,或者是否有更有效的方法?

  • 前面的章节介绍了所有 Redis 的重要功能组件: 数据结构、数据类型、事务、Lua 环境、事件处理、数据库、持久化, 等等, 但是我们还没有对 Redis 服务器本身做任何介绍。 不过, 服务器本身并没有多少需要介绍的新东西, 因为服务器除了维持服务器状态之外, 最重要的就是将前面介绍过的各个功能模块组合起来, 而这些功能模块在前面的章节里已经介绍过了, 所以本章将焦点放在服务器的初始化过程,

  • 我想在一些计算机之间建立点对点连接,这样用户就可以在没有外部服务器的情况下聊天和交换文件。我最初的想法如下: 我在服务器上制作了一个中央服务器插座,所有应用程序都可以连接到该插座。此ServerSocket跟踪已连接的套接字(客户端),并将新连接的客户端的IP和端口提供给所有其他客户端。每个客户端都会创建一个新的ServerSocket,所有客户端都可以连接到它。 换句话说:每个客户端都有一个Se

  • 本文向大家介绍java UDP通信客户端与服务器端实例分析,包括了java UDP通信客户端与服务器端实例分析的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了java UDP通信客户端与服务器端。分享给大家供大家参考,具体如下: 最初Udp是以字节为单位进行传输的,所以有很大的限制 服务器端: 用户端: 注:由于必须以字节为单位进行传输,Udp的传输用了一个容器类的东西,用来接收字节 先建

  • 问题内容: 我试图用没有gui的服务器连接带有gui的客户端。连接已完成,但我看不到这两个应用程序之间的任何消息。(我应该在客户端中找到SERVER HERE,在服务器中找到CLIENT HERE) 客户端连接代码: (输入和输出在此客户端类扩展到的GUI类中定义。定义为“受保护的BufferedReader输入;受保护的PrintWriter输出;”) 另外,服务器代码: 连接似乎还可以,所以我