当前位置: 首页 > 面试题库 >

Java:我没有收到其他客户端的消息吗?

江育
2023-03-14
问题内容

有人知道我的代码有什么问题吗?
当我用client1写东西时,我只能在服务器和client1上看到它,而在client2上看不到它。

Client.java中的run():

public void run() {
        Scanner input = new Scanner(System.in);

        try {

            Socket client = new Socket(host, port);

            System.out.println("client started");

            OutputStream out = client.getOutputStream();
            PrintWriter writer = new PrintWriter(out);

            InputStream in = client.getInputStream();
            BufferedReader reader = new BufferedReader(new InputStreamReader(in));

                String i = input.nextLine();
                writer.write(clientname + ": " + i + newline);
                writer.flush();

                String s = null;

                while((s = reader.readLine()) != null) {

                    System.out.println(s);

                }

            writer.close();
            reader.close();
            client.close();

        }

如果您需要服务器代码或其他任何内容,请询问。
提前致谢!!

另外,服务器:

public class Server {

    public static void main(String[] args) {
        int port = 40480;
        int max = 10;

        ExecutorService executor = Executors.newFixedThreadPool(max);

        try {
            ServerSocket server = new ServerSocket(port);
            System.out.print("server started" + "\n");

            while(true) {

                try {
                    Socket client = server.accept();

                    executor.execute(new Handler(client));

                }

                catch (IOException e) {
                    e.printStackTrace();

                }

            }

        } catch(Exception e) {
            e.printStackTrace();

        }

    }

}

和处理程序

public class Handler implements Runnable{

    private Socket client;

    public Handler(Socket client) {
        this.client = client;

    }

    @Override
    public void run() {

        try {

            OutputStream out = client.getOutputStream();
            PrintWriter writer = new PrintWriter(out);

            InputStream in = client.getInputStream();
            BufferedReader reader = new BufferedReader(new InputStreamReader(in));

            String s = null;

            while((s = reader.readLine()) != null) {

                writer.write(s + "\n");
                writer.flush();

                System.out.println(s);

            }

            writer.close();
            reader.close();
            client.close();

        }

        catch(Exception e) {


        }

    }

}

问题答案:

这是一个示例-
尚不完整,但应使您了解如何将输出多播到许多侦听客户端。有更好的方法来执行此操作,但是我写的类似于您执行套接字的方式。它还在许多地方都缺少错误检查,因此我将其留给读者练习。还编写了此代码,以便可以在Java
1.6或更高版本上使用。

该代码使用Server对象中维护的已连接客户端的列表。从一个客户端收到输入时,输出将多播到“客户端”列表中的每个客户端。编写是通过Client类中的write方法完成的。

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.LinkedList;
import java.util.Iterator;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class MulticastEchoServer {
    List<Client> clientList = new LinkedList<Client>();
    ExecutorService executor;

    int port = 40480;
    int max = 10;

    public MulticastEchoServer() {
        this.executor = Executors.newFixedThreadPool(max);
    }

    public void writeToAllClients(String string) throws IOException {
        // Multiple threads access this so it must be in synchronized block
        synchronized (this.clientList) {
            Iterator<Client> iter = this.clientList.iterator();
            while (iter.hasNext())
                iter.next().write(string);
        }
    }

    public void addClient(Client client) {
        // Multiple threads access this so it must be in synchronized block
        synchronized (this.clientList) {
            clientList.add(client);
        }
    }

    public void removeClient(Client client) {
        // Multiple threads access this so it must be in synchronized block
        synchronized (this.clientList) {
            clientList.remove(client);
        }
    }

    public void listen() {
        try {
            ServerSocket server = new ServerSocket(port);
            System.out.println("server started and listening for connections");

            while (true) {
                try {
                    Socket socket = server.accept();
                    System.out.print("connection accepted" + "\n");

                    Client newClient = new Client(this, socket);

                    this.addClient(newClient);
                    this.executor.execute(newClient);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        new MulticastEchoServer().listen();
    }

    private class Client implements Runnable {

        Socket socket;
        PrintWriter writer;
        BufferedReader reader;
        MulticastEchoServer server;

        public Client(MulticastEchoServer server, Socket socket) throws IOException {
            this.server = server;
            this.socket = socket;
            this.writer = new PrintWriter(this.socket.getOutputStream());
            this.reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        }

        synchronized public void write(String string) throws IOException {
            writer.write(string);
            writer.flush();
        }

        public void close() {
            this.writer.close();
            try {
                this.reader.close();
            } catch (IOException e) {
            }
            try {
                this.socket.close();
            } catch (IOException e) {
            }
        }

        @Override
        public void run() {
            System.out.println("Client Waiting");

            String inString = null;
            try {
                while ((inString = this.reader.readLine()) != null) {
                    this.server.writeToAllClients(inString + "\n");
                    System.out.println(inString);
                }
            } catch (IOException e1) {
            }

            server.removeClient(this);
            this.close();
            System.out.println("Client Closed");
        }
    }

}


 类似资料:
  • 1.场景描述:设备向Netty服务器发送数据(大约##20ms间隔##),Netty服务器向客户端转发消息##立即##(IOS或Android)。2.关联业务代码CTX.WriteAndFlush(msg) 3.发出网络服务器可以及时接收设备数据,网络服务器也可以及时将数据写入套接字缓冲区。但Netty客户端收到消息时延!!!(如5s时延) 4.服务器带宽配置入站100M/bps位/秒。出站5M/

  • 我使用的是spring boot 2.2.4版本,spring-kafka 2.4.2版本 我的场景是以下一个: 所以我写了folloqing代码 生产者微服务 spring kafka配置: 在制作人方面所有的工作都很好。我能创造话题和发送信息。 消费者微服务 动态侦听器类 当我在生产者端发送消息时,我可以看到以下日志: 在消费者方面,我没有看到任何信息。我只看到下面的指纹: 谁能告诉我我错在哪

  • 我在远程机器上设置了Kafka和动物园管理员。在那台机器上,我可以看到下面使用官方网站上的测试方法工作。 但是当我使用本地消费者脚本时,它就不起作用了: 我试着把它改成: 然后运行客户端使用者脚本,它会给出错误: [2017-08-11 15:49:01,591]获取相关id为3的元数据时警告错误:{listings-incoming=leader_not_available}(org.apach

  • 我是一个使用python进行套接字编程的初学者。我正在做我的课程项目。我的项目的一部分需要用不同的端口发送和接收UDP消息。提供了名为robot的服务器程序,我需要编写名为student的客户端程序,它可以与机器人进行交互。因此,我不能显示服务器程序中的所有源代码。 这是服务器程序中与UDP套接字相关的部分 这是我的客户端程序。s3 是 UDP 套接字。我可以成功地向服务器程序发送消息,但无法从中

  • 我一直在努力通过Smack和Openfire服务器与XMPP聊天。我的问题如下: 每当一个用户向另一个用户发送消息时,该消息就会在另一个用户处正确接收。但是任何回复都不会出现在第一条消息的发件人处。因此,用户1成功地发送给用户2。然后,用户2无法向用户1发送任何回复。另一方面,如果我重新启动并让用户再次登录,则用户2可以发送给用户1,但反之亦然。 我想说的是,只有聊天的发起者才能发送消息,接收者不

  • 为方便测试,我们以RPC中的例子来实现服务端,具体请看文档RPC章节。 纯原生异步 public static function mainServerCreate(ServerManager $server,EventRegister $register): void { // TODO: Implement mainServerCreate() method.