服务器/客户端不通过socket [Java]发送或接收数据?

时间:2014-01-18 03:28:37

标签: java sockets client chat

我设置了服务器/客户端聊天程序。应该发生的是服务器设置可以A)从客户端读取,A2)从客户端读取内容并将其发送给所有其他客户端或B)从控制台获取输入以写入客户端。客户端可以从服务器读取并要求它发送消息(也可以从控制台读取)。

有三个文件:

  • Maim.java(稍后将用于其他目的;现在只是Server类的样板)
  • Host.java(服务器)
  • Client.java(客户端)

你应该打开一个终端并运行启动服务器的Maim,然后打开另一个终端并运行运行客户端的Client。但是,消息不会在两者之间传输,这很奇怪,因为

  1. 正在成功设置流和套接字
  2. 如果你允许'null'被发送(即:(message = in.readLine())vs。((message = in.readLine())!= null)),'null'将被发送。但只有'null'而没有别的。
  3. 无论如何,这是代码:

    Maim:

        import java.io.*;
        import java.util.*;
        public class Maim {
            static final int port = 9001;
            static final String localhost = "localhost";
            public static void main(String[] args) throws IOException {
                Scanner nameReader = new Scanner(System.in);
                System.out.println("What will your name be ? (Currently this        feature is unused)");
                    new Host(nameReader.nextLine()).setUpServer();
           }    
        }
    

    主持人:

        import java.net.*;
        import java.io.*;
        import java.util.*;
        public class Host {
            Socket clientReader;
            String name;
            private ArrayList<ClientReader> clients;
            public Socket getSocket() {
                return clientReader;
            }
            public Host(String name) {
                this.name = name;
            }
            public void setUpServer(){
                clients = new ArrayList<ClientReader>();
                try {
                    ServerSocket server =  new ServerSocket(Maim.port);
                    System.out.println("Server set up without fail. Now awaitting clients.");
                    this.clientReader(server);
                } catch (IOException e) {
                    System.out.println("Failure setting up server on host's network.");
                    e.printStackTrace();
                }
            }
            public void clientReader(ServerSocket server) {
                try {
                    while (true) {
                        clientReader = server.accept();
                        ClientReader newReader = new ClientReader(clientReader);
                        clients.add(newReader);
                        Thread newClientThread = new Thread(newReader);
                        newClientThread.start();
                        Thread newHostThread = new Thread(new ClientWriter());
                        newHostThread.start();
                        System.out.println("New client connection");
                    }
                } catch (IOException e) {
                    System.out.println("Failure to connect to client.");
                    e.printStackTrace();
                }
            }
            public void sendAll(String message) {
                try {
                    for (ClientReader client: clients) {
                        PrintWriter writerToClient = new PrintWriter(client.getSocket().getOutputStream());
                        writerToClient.println(message);
                    }
                } catch (IOException e) {
                    System.out.println("Error sending message " + message + " .");
                    e.printStackTrace();
                }
            }
            public class ClientReader implements Runnable {
                private BufferedReader consoleReader;
                private Socket server;
                public ClientReader(Socket clientSocket) {
                    try {
                        server = clientSocket;
                        consoleReader = new BufferedReader(new InputStreamReader(this.server.getInputStream()));
                        consoleReader.ready();
                        System.out.println("Succesfully received client's stream");
                    } catch(IOException e) {
                        System.out.println("Error getting input stream from host.");
                        e.printStackTrace();
                    }
                }
                public Socket getSocket() {
                    return this.server;
                }
                public void run() {
                    String newMessage = new String();
                    try {
                        while ((newMessage = this.consoleReader.readLine()) != null) {
                            System.out.println(newMessage);
                            sendAll(newMessage);
                        }
                    } catch(IOException e) {
                        System.out.println("Error sending client message to clients.");
                        e.printStackTrace();
                    }
                }        
    
            }
            public class ClientWriter implements Runnable {
                private PrintWriter consoleWriter;
                public void run() {
                    try {
                        String newMessage;
                        Scanner consoleReader = new Scanner(System.in);
                        while (!(newMessage = consoleReader.nextLine()).equals("\n")) {
                            System.out.println(newMessage);
                            sendAll(newMessage);
                        }
                    } catch(Exception e) {
                        System.out.println("Error sending host's message to clients.");
                        e.printStackTrace();
                    }
                }
            }
        }
    

    客户:

        import java.net.*;
        import java.io.*;
        import java.util.*;
        public class Client {
            Socket host;
            PrintWriter writeToHost;
            BufferedReader readFromHost;
            public static void main(String[] args) {
                new Client().connectToHost();
            }
            public void connectToHost() {
                try { 
                    this.host = new Socket(Maim.localhost,Maim.port);
                    this.writeToHost = new PrintWriter(host.getOutputStream());
                    this.readFromHost = new BufferedReader(new InputStreamReader(host.getInputStream()));
                    this.readFromHost.ready();
                    System.out.println("Connected to host successfully.");
                    this.go();
                } catch (IOException e) {
                    System.out.println("Error connecting to host's server.");
                    e.printStackTrace();
                }
            }
            public void go() {
                Thread innerReader = new Thread(new InnerReader());
                innerReader.start();
                Thread innerWriter = new Thread(new InnerWriter());
                innerWriter.start();
            }
            public class InnerReader implements Runnable {
                public void run() {
                    try {
                        String message = new String();
                        while ((message = readFromHost.readLine()) != null) {
                            System.out.println(message);
                        }
                    } catch(Exception e) {
                        System.out.println("Gotta Catch 'Em All! Insert proper exception string later");
                        e.printStackTrace();
                    }
                }
            }
            public class InnerWriter implements Runnable {
                public void run() {
                    try {
                        Scanner consoleReader = new Scanner(System.in);
                        String newMessage = new String();
                        while (!(newMessage = consoleReader.nextLine()).equals("\n")) {
                            System.out.println(newMessage);
                            writeToHost.println(newMessage);
                        }
                    } catch (Exception e) {
                        System.out.println("Im so tired and Java's consistent boilerplate is so mind-numbing i can't even synthesize a proper sentence here");
                        e.printStackTrace();
                    }
                }
            }
        }
    

    感谢您的帮助!

2 个答案:

答案 0 :(得分:4)

写完之后你需要刷新PrintWriter

writerToClient.flush();

这将放在sendAll中的Host

答案 1 :(得分:2)

我建议您刷新PrintWriter

我还建议通过Socket Options禁用Nagel的算法。然后即使是小消息也会立即发送。