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

message = in.readLine();

В InputReader.java file и не читает ввода?

Мой код выглядит следующим образом, пожалуйста, помогите.

SimpleServer1.java

public class SimpleServer1 {
public static void main(String args[]){
    int portNumber = Integer.parseInt(args[0]);

    ServerSocket serverSocket = null;
    Socket clientConnection = null;

    try{
        //setup sockets
        serverSocket = new ServerSocket(portNumber);
        clientConnection = serverSocket.accept();
        System.out.println("Connected to" + clientConnection.getInetAddress());

        //setup streams
        BufferedReader in = new BufferedReader(new InputStreamReader(clientConnection.getInputStream()));
        PrintWriter out = new PrintWriter(clientConnection.getOutputStream());
        out.flush();

        //read input from stream
        String message;
        while((message = in.readLine()) != null){
            //return message to client
            out.println("Echo: " + message);

            System.out.println(clientConnection.getInetAddress() + ": " + message);
            if (message.equalsIgnoreCase("bye")){
                System.out.println("Closing connection...");
                break;
            }
        }
        //close streams
        out.close();
        in.close();
        clientConnection.close();
    }catch(Exception e){
        e.printStackTrace();
    }
}

SimpleClient1.java

public class SimpleClient1{
public static void main(String args[]){
    String hostName = (args[0]);
    int portNumber = Integer.parseInt(args[1]);

    try{
        Socket serverConnection = new Socket(hostName, portNumber);
        PrintWriter out = new PrintWriter(serverConnection.getOutputStream(), true);
        out.flush();

        Thread listener = new Thread(new InputReader(serverConnection));
        listener.start();

        Scanner keyboard = new Scanner(System.in);
        String userInput;
        while((userInput = keyboard.nextLine()) != null){
            out.println(userInput);
            if (userInput.equalsIgnoreCase("bye")){
                break;
            }

        }
        //closing streams
        out.close();
        serverConnection.close();

    }catch(Exception e){
        e.printStackTrace();
    }   
}

InputReader.java <- с чем я пытаюсь запустить свой поток

public class InputReader implements Runnable{
private Socket serverConnection;
private BufferedReader in;
public InputReader(Socket socket){
    serverConnection = socket;
    try{
        in = new BufferedReader(new InputStreamReader(serverConnection.getInputStream()));
    }catch(IOException ioE){ioE.printStackTrace();}
}

@Override
public void run() {
    try{
        String message;
        while(true){
            System.out.println("done");
            message = in.readLine();
            System.out.println(message);
        }
    }catch(IOException ioE){ioE.printStackTrace();}

}

В конечном итоге я хотел бы как читать, так и писать из потоков сокетов с помощью потоков.

Заранее спасибо :)

Cobezz

1
Cobes 8 Мар 2015 в 12:25

2 ответа

Лучший ответ

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

0
Atuos 8 Мар 2015 в 09:38

В SimpleServer1.java вы должны добавить out.flush ();

While ((message = in.readLine ())! = null) {

Out.println ("Эхо:" + сообщение);

out.flush ();

System.out.println (clientConnection.getInetAddress () + ":" + сообщение);

If (message.equalsIgnoreCase ("пока")) {

System.out.println ("Закрытие соединения ...");

Перемена;

}

}

0
Dutn 8 Мар 2015 в 10:22