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



>有人知道我的代码出了什么问题吗?
当我使用 client1 编写内容时,我只在服务器和客户端 1 上看到它,但在客户端 2 上看不到它。

在客户端.java中运行((:

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 或更高版本上使用。

该代码使用在服务器对象中维护的已连接客户端的列表。当从一个客户端接收到输入时,输出将多播到"客户端"列表中的每个客户端。写入是通过客户端类中的写入方法完成的。

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

在你的处理程序中:

while((s = reader.readLine()) != null) { writer.write(s + "n"); writer.flush(); System.out.println(s); }

您只是将字符串写回发送方,而不是所有连接的套接字

相关内容

  • 没有找到相关文章

最新更新