Как сделать резьбовое соединение в Java? - PullRequest
1 голос
/ 19 сентября 2011

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

МОЙ КЛИЕНТСКИЙ КЛАСС:

public class Client {

    public void run() throws IOException{
        Socket s = new Socket("localhost",9999);
        PrintStream ps = new PrintStream(s.getOutputStream());
        ps.println(readFromConsole());
    }

    public String readFromConsole(){
        String result ;
        Scanner in = new Scanner(System.in);
        result = in.nextLine();
        return result;
    }
    public static void main(String[] args) throws Exception {
        Client c = new Client();
        c.run();
    }
}

МОЙ СЕРВЕР-КЛАСС:

public class Server {
    ServerSocket ss;
    public void run() throws IOException{
        ss = new ServerSocket(9999);
        while(true){
            TestForThread t;
            try {
                t = new TestForThread(ss.accept());
                Thread testThread = new Thread(t);
                testThread.start();
            } catch(IOException e){
                e.printStackTrace();
            }
        }
        //BufferedReader br =
        //new BufferedReader(new InputStreamReader(sForAccept.getInputStream()));
        //String temp = br.readLine();
        //System.out.println(runCommand(temp));
    }
    protected void finalize() {
        // Objects created in run method are finalized when
        // program terminates and thread exits
        try {
            ss.close();
        } catch (IOException e) {
            System.out.println("Could not close socket");
            System.exit(-1);
        }
    }

    public static void main(String[] args) throws Exception{
        Server s = new Server();
        s.run();
    }
}

МОЙ РЕЗЕРВНЫЙ КЛАСС ::

public class TestForThread implements Runnable {

    private Socket client;
    public TestForThread(Socket c){
        client = c;
    }

    public void run() {
        String line;
        BufferedReader in = null;
        PrintWriter out = null;
        try {
            in = new BufferedReader(new InputStreamReader(client
                .getInputStream()));
            out = new PrintWriter(client.getOutputStream(), true);
        } catch (IOException e) {
            System.out.println("in or out failed");
            System.exit(-1);
        }

        while (true) {
            try {
                line = in.readLine();
                String commandResult = runCommand(line);
                System.out.println(commandResult);
            } catch (IOException e) {
                System.out.println("Read failed");
                System.exit(-1);
            }
        }
    }

    public String runCommand(String command) throws IOException {
        Runtime runtime = Runtime.getRuntime();
        Process process = runtime.exec(command); // you might need the full path
        InputStream is = process.getInputStream();
        InputStreamReader isr = new InputStreamReader(is);
        BufferedReader br = new BufferedReader(isr);
        String line;
        String answer = "";
        while ((line = br.readLine()) != null) {
            System.out.println(line);
            answer = answer + line + "\n";
        }
        return answer;
    }
}

Большое спасибо.

1 Ответ

1 голос
/ 17 марта 2012

В своем коде вы используете BufferedReader для переноса InputStream из Socket и вызываете readLine () для получения строки, отправленной клиентом.Согласно http://docs.oracle.com/javase/1.5.0/docs/api/java/io/BufferedReader.html#readLine(), readLine () будет ожидать '\ n' или '\ r'.Проблема заключается в Client.readFromConsole (), поскольку он не возвращает строку, содержащую символ завершения строки.

Путем добавления «\ n» или «\ r» в строку, возвращаемую клиентом.Метод readFromConsole (), что-то вроде:

public String readFromConsole() {
    String result ;
    Scanner in = new Scanner(System.in);
    result = in.nextLine();
    return result+System.getProperty("line.separator");
}

Сервер больше не будет работать после первого запроса.

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