Вопрос о сокете Java - PullRequest
       21

Вопрос о сокете Java

1 голос
/ 12 апреля 2009

Я пытаюсь написать простую программу сервер-клиент, но у меня проблема: Я могу отправить данные с клиента на сервер, но не могу отправить данные с сервера (я не могу получить их на клиенте): (
Итак, как отправить данные с сервера и получить их на клиенте?

Сервер:

//this is in a thread
try {
    server = new ServerSocket(1365);
} catch (IOException e) {
    e.printStackTrace();
}
while (!exit) {
    try {
        clientSocket = server.accept();
        is = new DataInputStream(clientSocket.getInputStream());
        os = new PrintStream(clientSocket.getOutputStream());
        while ((line = is.readLine()) != null) {
            System.out.println("Message from client: " + line);
            //if (line.equals("exit")) {
            //  exit = true;
            //}
            if (line.equals("say something")) {
                os.write("something".getBytes());
            }
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
    try {
        is.close();
    } catch (IOException ex) {
        ex.printStackTrace();
    }
os.close();
}

Клиент:

try {
    socket = new Socket(host, 1365);
    os = new DataOutputStream(socket.getOutputStream());
    is = new DataInputStream(socket.getInputStream());
} catch (UnknownHostException e) {}
if (socket != null && os != null && is != null) {
    try {
        os.writeBytes("say something");
        //get the answer from server
        os.close();
        is.close();
        socket.close();
    } catch (IOException e) {}
}

(простите за длинный код)
Заранее спасибо.

Ответы [ 3 ]

7 голосов
/ 12 апреля 2009

OutputStream вашего сервера - это PrintStream, а InputStream вашего клиента - это DataInputStream. Попробуйте изменить сервер для использования DataOutputStream , как ваш клиент.

Еще лучше, возможно, изменить оба на использование PrintWriter и BufferedReader, как пример пары клиент / сервер в Обучающее руководство по Socket . <Ч />

Просто чтобы немного объяснить , почему ваш код не работал: вы можете рассматривать объекты Stream как фильтры, через которые проходят ваши данные. Фильтр изменяет ваши данные, форматируя их так, чтобы фильтр , соответствующий на другом конце, мог их понять. Когда вы отправляете данные через один тип OutputStream, вы должны получить их на другом конце с соответствующим InputStream.

Так же, как вы не можете хранить объект String в double или double в String (не преобразовывая его), вы не можете отправить данные из одного типа OutputStream (в данном случае PrintStream) другой тип InputStream.

0 голосов
/ 13 апреля 2009

После вашего os.write() до os.flush(); сообщение очень маленькое и, возможно, оно не отправляется, поскольку оно не заполняет буфер.

0 голосов
/ 13 апреля 2009

Я думаю, что другая проблема заключалась в том, что я не отправлял "\ n" после текста, но использовал метод readLine ().

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