Получить двойное число вставленных - Программирование клиент-сервер - PullRequest
0 голосов
/ 28 декабря 2011

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

У меня есть следующий сервер:

public class Server {

public static void main(String args[]) throws Exception {
    ServerSocket server = new ServerSocket(6789);
    while(true) {
        try {
            Socket aux = server.accept();

            DataInputStream dis = new DataInputStream(aux.getInputStream());
            DataOutputStream dos = new DataOutputStream(aux.getOutputStream());
            int total = 0;
            while(dis != null) {
                int res = dis.read();
                total = 2*(res);
                dos.writeInt(total);
            }

        }
        catch (EOFException e) {
            out.println("The client exit!");
            continue;
        }
    }
}

}

И следующий клиент:

public class Client {


public static void main(String args[]) throws Exception {


    Socket client = new Socket("localhost", 6789);
    DataInputStream dis = new DataInputStream(client.getInputStream());
    DataOutputStream dos = new DataOutputStream(client.getOutputStream());
    BufferedReader input = new BufferedReader(new InputStreamReader(in));       

    while(true) {
            int fromClient = input.read();
            dos.writeInt(fromClient);
            client.shutdownOutput(); //to show to the server the end of file
            int fromServer = dis.readInt();
            out.println(fromServer);
    }       
}       

}

Может кто-нибудь помочь, пожалуйста?

IНа стороне сервера появилась следующая ошибка:

Exception in thread "main" java.net.SocketException: Broken pipe
    at java.net.SocketOutputStream.socketWrite0(Native Method)
    at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:109)
    at java.net.SocketOutputStream.write(SocketOutputStream.java:132)
    at java.io.DataOutputStream.writeInt(DataOutputStream.java:197)
    at Server.main(Exercicio3.java:21)

И на стороне клиента, когда я вставляю значение (в данном случае '1'):

1
0
Exception in thread "main" java.net.SocketException: Broken pipe
    at java.net.SocketOutputStream.socketWrite0(Native Method)
    at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:109)
    at java.net.SocketOutputStream.write(SocketOutputStream.java:132)
    at java.io.DataOutputStream.writeInt(DataOutputStream.java:197)
    at Client.main(Exercicio4.java:25)

Спасибо

Ответы [ 2 ]

2 голосов
/ 28 декабря 2011

Не зная, в чем ваша проблема, я вижу одну проблему:

int res = dis.read();

res - следующий байт на входе (см. doc ) и не является целым числом, введенным вашим пользователем. Это будет первый байт кода символа из того, что ввел ваш пользователь.

1 голос
/ 28 декабря 2011
  • Перед отправкой результата обратно клиенту существует бесконечный цикл.

           while(dis != null) {
               int res = dis.read();
               total = 2*(res);
           }
           dos.writeInt(total);
    

    Переместите эту последнюю строку в скобки, и она должна работать.

           while(dis != null) {
               int res = dis.read();
               total = 2*(res);
               dos.writeInt(total);
           }
    
  • Кроме того, звонить client.shutdownOutput() не обязательно.Вы просто получите исключения, когда попытаетесь записать его в следующий раз:

    Disables the output stream for this socket. For a TCP socket, any previously written data will be sent followed by TCP's normal
    

    последовательность завершения соединения.Если вы запишете в выходной поток сокета после вызова shutdownOutput () для сокета, поток сгенерирует IOException.`

  • И еще есть проблема, упомянутая ранее:

    int res = dis.read();
    

    должно быть

    int res = dis.readInt();
    
  • Выесть аналогичная проблема при чтении ввода пользователя в клиенте.Используйте это вместо:

    int fromClient = Integer.parseInt(input.readLine());
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...