Темы, являющиеся анти-социальными - PullRequest
3 голосов
/ 10 февраля 2011

Итак, у меня два потока - поток сервера и поток клиента.Я могу заставить сервер писать, но он никогда не будет прочитан клиентом.Вот клиент, сервер и поток, созданный сервером для обработки клиентского соединения.

Клиент - подключитесь к сокету и попробуйте выполнить пинг-понг с сервером.Клиент ожидает, что сервер сначала свяжется с ним!

public class ClientMain {    
    public static void main(String[] args) throws UnknownHostException, IOException {
        Socket socket = new Socket("localhost", 14285);

        BufferedReader in = null;
        PrintWriter out = null;
        try {
            in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            out = new PrintWriter(socket.getOutputStream());
        } catch(IOException e) {
            Log.write("Error in client thread ");
            Log.write(e);
        }
        while(true) {
        System.out.println("About to read!! :-D");
            String fromServer = in.readLine();
            System.out.println("From server: " + fromServer);
            out.println("PONG");
        }
    }
}

Сервер - это метод запуска сервера.Он порождает поток для наблюдения за serverSocket и порождает потоки клиента по мере необходимости.Да, я понимаю, что это плохая практика - определять класс внутри такого метода ... и мои извинения, если его трудно прочитать.

public void start() {
    this.running = true;
    // probably could have done this better, but it gets the job done
    class Start implements Runnable {
        Server server;
        Start(Server server) { this.server = server; }
        public void run() {
            while(server.running) {
                try {
                    Socket socket = server.serverSocket.accept();
                    Log.write("Accepted socket");
                    new ClientThread(server,socket).start();
                } catch (IOException e) { e.printStackTrace(); }
            }
        }

    }
    Thread start = new Thread(new Start(this));
    start.start();
}

Вот клиентский поток - это еще не всемного тоже.Я получаю свои потоки из сокета и записываю некоторые данные, пока их больше нет, затем получаю некоторые данные от клиента.

        public void run() {
            Log.write("Running clientthread");
            BufferedReader in = null;
            PrintWriter out = null;
            try {
                in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                out = new PrintWriter(socket.getOutputStream());

            } catch(IOException e) {
                running = false;
                Log.write("Error in client thread " + getName());
                Log.write(e);
            }
            while(running) {

                try {
                    String message = messageQueue.poll();
                    while(message != null) {
                        out.println(message);
                        Log.write("wrote message: " + message);
                        message = messageQueue.poll();
                    }
                    String input = in.readLine();
                    System.out.println("From client: " + input);
                    server.handle(username,input,this);
                }
                catch(IOException e) {
                    Log.write("Error in client thread " + getName() + " username=" + username);
                    Log.write(e);
                    break;
                }
            }
        }

Теперь вот что я получаю для вывода на серверсторона:

Accepted socket
Running clientthread
wrote message: PING

Это указывает на то, что он получает соединение и пишет сообщение.(Для ясности, PING заполняется в messageQueue, когда создается экземпляр клиентского потока, таким образом, всегда есть что сказать клиенту, чтобы начать разговор. Это как ледокол для застенчивых потоков, а?) Это также указывает мнечто он ничего не получает от клиента обратно, потому что ничего не печатается после in.readLine()

Кроме того, единственным выводом на клиенте является уведомление, которое он собирается прочитать.Так как же может быть упущено то, что пишет сервер?

Любые идеи приветствуются!

Спасибо !!

Ответы [ 2 ]

3 голосов
/ 10 февраля 2011

Наверное, попробуйте добавить:

out.flush();
out.close();
1 голос
/ 10 февраля 2011

Добавляйте out.flush(); каждый раз, когда хотите отправить сообщение.НЕ ЗАКРЫВАЙТЕ поток, пока вы не закончили с ним.добавьте out.close(); только , когда закончите с потоком.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...