【问题标题】:Server/client not sending or receiving data through socket [Java]?服务器/客户端不通过套接字 [Java] 发送或接收数据?
【发布时间】:2014-01-18 03:28:36
【问题描述】:

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

共有三个文件:

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

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

  1. 流和套接字正在成功设置和
  2. 如果您允许发送 'null'(即:(message = in.readLine()) 与 ((message = in.readLine()) != null)),则将发送 'null'。但只有'null',没有别的。

不管怎样,代码如下:

致残:

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

感谢您的帮助!

【问题讨论】:

  • 你可能不知道它实际上拼写为Main。残废意味着非常不同。
  • 我的致残方法总是特别暴力。
  • 这就是笑话的巧妙之处。一,它是旧聊天程序 AIM 的一个转折点。第二,它是对经典“样板”Java 文件 Main 的一个转折。

标签: java sockets client chat


【解决方案1】:

您需要在写入PrintWriter 后刷新它:

writerToClient.flush();

这将进入sendAll 中的Host。

【讨论】:

  • @user3208872 请考虑接受上述答案:)
【解决方案2】:

我建议刷新你的PrintWriter。

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

【讨论】:

    猜你喜欢
    • 2020-07-10
    • 2011-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-14
    相关资源
    最近更新 更多