Java - сокет не читает, пока клиент не отключится? - PullRequest
0 голосов
/ 27 сентября 2011

Итак, я сделал Сервер и Клиент с сокетами на Java.Я пытаюсь заставить сервер читать / писать из сокета, но он читает только после того, как клиент отключается:

        System.out.println("Server initialized");
        clientSocket = server.accept();
        System.out.println("Client connected");

        PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
        BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));

        for(int loop = 0;loop<5;loop++){
            out.write("Hello");
            System.out.println(in.readLine());
        }   //end for

Проблема в том, что, как только клиент подключается, он говорит "Клиент подключен"тогда он не проходит через цикл for.Однако, как только клиент отключается, сервер выполняет цикл for и возвращает

null
null
null
null
null

Чего мне здесь не хватает?Вот мой полный код сервера:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {
    public ServerSocket server;

    public Server(int port){
        try {
            server = new ServerSocket(port);
        } catch (IOException e) {
            System.out.println("Cannot bind to port: "+ port);
            System.exit(-1);
        }

    }   //end constructor

    public void WaitForClient() throws IOException{
        Socket clientSocket = null;

        try {
            System.out.println("Server initialized");
            clientSocket = server.accept();
            System.out.println("Client connected");

            PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
            BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));

            for(int loop = 0;loop<5;loop++){
                out.write("Hello");
                System.out.println(in.readLine());
            }   //end for

        }   //end try
        catch (IOException e) {
            System.out.println("Accept failed");
            System.exit(-1);
        }   //end catch

        clientSocket.close();
        server.close();

    }   //end method

}   //end class

(Мой основной метод вызывается из другого класса.)

Ответы [ 4 ]

1 голос
/ 27 сентября 2011

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

Таким образом, он блокируется до тех пор, пока не прервется ваше соединение.

Попробуйте метод чтения BufferedReader:

public int read(char[] cbuf,
       int off,
       int len)

и передать массив фиксированной длины, например:

char[] cbuf = new char[1024];

Используйте возвращаемое значение вызова чтения, чтобы увидеть, сколько байтов было в последнем чтении (0-1024). если вы прочитаете 1024, то, вероятно, еще что-то прочитаете. Если вы читаете 0, то, скорее всего, больше нечего читать.

1 голос
/ 28 сентября 2011

Вы читаете строки, но не пишете их. write () не записывает новую строку и блокирует readLine () до тех пор, пока не получит ее.

1 голос
/ 27 сентября 2011

Вы должны очистить поток на сервере, если хотите немедленно увидеть результаты. Поток автоматически очищается на close(), поэтому вы увидели вывод.

0 голосов
/ 28 сентября 2011

Это код на стороне сервера для приема строки от клиента, но, согласно моему коду, вы будете использовать DataInputStream и DataOutputStream вместо PrintWriter и BufferedReader.

Этот код полностью работает для клиента One-One ..

В коде "jta" находится JTextArea ..

soc = server.accept ();

while (true)

{

        String data="";
            try
            {                   
                dis = new DataInputStream(soc.getInputStream());
                dos = new DataOutputStream(soc.getOutputStream());
                data = dis.readUTF();
            }
            catch(Exception e)
            { }
            jta.append(data + "\n");
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...