SocketChannel Клиент-Сервер - PullRequest
0 голосов
/ 11 мая 2018

Клиент подключается к серверу и затем входит в следующий цикл. Он берет одну строку ввода с консоли, отправляет ее на сервер. Если строка ввода представляет собой один символ «x», клиент завершает работу.

Сервер

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

Неблокирующий режим

Клиент должен использовать буферы и неблокирующий канал сокета.

Режим блокировки

Сервер должен использовать буферы и блокирующий канал сокета.

выпуск

Проблема, с которой я столкнулся, заключается в том, что буфер на стороне сервера не очищается и печатает старый ввод с новым вводом. Пример:

Сообщение получено: привет

Сообщение получено: helloworld

Сообщение получено: helloworldthis

Сообщение получено: helloworldthisis

Сообщение получено: helloworldthisis Edwin

И это должна быть печать: привет

мир

это

есть

Edwin.

Это код сервера:

public class EchoServer_1 
{
    //  private static CharBuffer buffer = CharBuffer.allocate(1024);
    private static ByteBuffer buffer = ByteBuffer.allocate(1024);
    private static StringBuffer reqString = new StringBuffer();
    public static void main(String[] args) throws IOException
    {

        ServerSocketChannel serverSocketChannel = null;
        int serverPort = 10007;

        try{
            serverSocketChannel = ServerSocketChannel.open();
            serverSocketChannel.socket().bind(new InetSocketAddress (serverPort));
            //Blocking mode
            serverSocketChannel.configureBlocking(true);

            System.out.println("Port number: " + serverPort);
            System.out.println("Waiting for connection ..");

            SocketChannel sc = serverSocketChannel.accept();

            System.out.println ("Incoming connection from: " 
                    + sc.socket().getRemoteSocketAddress( ));

            // Read message from client
            while (true)
            {   
                buffer.clear();
                sc.read(buffer);
                buffer.flip();
                while(buffer.hasRemaining()) {
                    char c = (char) buffer.get();
                    if (c == '\r' || c == '\n') break;
                    reqString.append(c);             
                }

                log("Message received: " + reqString);

            }
        }catch (IOException ex)
        {
            if (serverSocketChannel != null)
                serverSocketChannel.close();
            System.err.println("Client has disconneted");
        }
    }
    private static void log(String str) {
        System.out.println(str);
    }
}

Это исходный код клиента:

public class EchoClient_1 
{

    private static Scanner stdIn = new Scanner(System.in);
    //  private static CharBuffer buffer = CharBuffer.allocate(1024);
    private static ByteBuffer buffer = ByteBuffer.allocate(256);

    public static void main(String[] args) throws IOException
    {
        String hostname = new String ("127.0.0.1");
        int port = 10007;

        try{
            InetSocketAddress address = new InetSocketAddress(hostname, port);
            SocketChannel sC = SocketChannel.open(address);
            sC.configureBlocking(false);

            log("Local address: " + hostname + " connecting to Server on port " + port
                    + "...");
            String userInput;

            System.out.println("Enter lines of characters: " );

            while ((userInput = stdIn.nextLine()) != null)
            {
                //Checks if user wants to exit
                if (userInput.equalsIgnoreCase("x")) 
                {

                    buffer.put (userInput.getBytes());
                    buffer.flip();
                    sC.write(buffer);
                    buffer.clear();
                    System.out.println("Closing ..");
                    sC.close();
                    break;
                }

                buffer.put (userInput.getBytes());
                buffer.flip();  
                sC.write(buffer);
                buffer.clear();                             
            }

            sC.close();

        }catch (IOException ex)
        {
        }
    }

    private static void log(String str) {
        System.out.println(str);
    }
}

Ответы [ 2 ]

0 голосов
/ 11 мая 2018

Вставить новую строку перед "buffer.clear ();"

reqString.setLength (0);

Как:

     while (true)
                {   
                    reqString.setLength(0);

                    buffer.clear();
                    sc.read(buffer);
                    buffer.flip();
                    while(buffer.hasRemaining()) {
                        char c = (char) buffer.get();
                        if (c == '\r' || c == '\n') break;
                        reqString.append(c);             
                    }

                    log("Message received: " + reqString);

                }
0 голосов
/ 11 мая 2018

Вы никогда не очищаете reqString.Вы должны сделать это после того, как войдете в систему.

...