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

时间:2014-09-10 15:20:38

标签: java sockets stream client message

有谁知道我的代码有什么问题?
当我用client1写东西时,我只是在服务器和客户端1上看到它,而不是在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) {


        }

    }

}

2 个答案:

答案 0 :(得分:1)

这是一个示例 - 它不完整,但应该让您了解如何将输出多播到多个侦听客户端。有更好的方法可以做到这一点,但我写的类似于你似乎在做套接字的方式。它也缺乏许多地方的错误检查,我把它作为读者的练习。此代码也已编写,因此可以在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 :(得分:0)

在你的经纪人中:

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

您只是将字符串写回发件人,而不是写入所有连接的套接字