SocketChannel 客户端-服务器

何塞·卡斯塔诺·帕尔多

客户端连接到服务器,然后进入下面的循环。它从控制台获取一行输入,将其发送到服务器。如果输入行是单个“x”字符,则客户端退出。

服务器

首先,它将自己的套接字地址打印到屏幕上。当它接收到一个连接时,它将对端的套接字地址打印到屏幕上(这样你就可以检查谁连接到服务器),然后进入以下循环。它从客户端接收一行消息,将接收到的消息打印到屏幕上。

非阻塞模式

客户端应该使用缓冲区和非阻塞套接字通道。

阻塞模式

服务器应该使用缓冲区和阻塞套接字通道。

问题

我遇到的问题是服务器端的缓冲区没有刷新,而是使用新输入打印旧输入。例子:

收到消息:你好

收到消息:helloworld

收到消息:helloworldthis

收到消息:helloworldthisis

收到消息:helloworldthisis 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);
    }
}
用户207421

你永远不会清除reqString您应该在登录后执行此操作。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

客户端-服务器插座

来自分类Dev

测试客户端服务器

来自分类Dev

客户端/服务器编程

来自分类Dev

iOS客户端服务器

来自分类Dev

客户端与服务器端模板(哪个?)

来自分类Dev

Mongodb服务器端与客户端处理

来自分类Dev

客户端服务器端模板nodejs

来自分类Dev

在服务器端访问客户端变量

来自分类Dev

服务器端或客户端渲染

来自分类Dev

客户端服务器端模板nodejs

来自分类Dev

在客户端委派服务器端验证

来自分类Dev

客户端数据到服务器端

来自分类Dev

使Web服务客户端与新服务器兼容

来自分类Dev

创建服务器/服务客户端

来自分类Dev

使Web服务客户端与更新的服务器兼容

来自分类Dev

客户端/服务器:从客户端运行“ nano编辑器”命令

来自分类Dev

客户端服务器应用程序的Angularjs

来自分类Dev

Python套接字服务器/客户端编程

来自分类Dev

服务器XSS与客户端XSS

来自分类Dev

C#namedpipes服务器/客户端

来自分类Dev

Asp.net客户端-服务器

来自分类Dev

如何上传客户端文件到服务器?

来自分类Dev

Java服务器-多客户端游戏设计

来自分类Dev

从服务器到客户端的MVC推送通知

来自分类Dev

监督gen_tcp客户端/服务器

来自分类Dev

hazelcast客户端和服务器设置

来自分类Dev

hazelcast客户端无法连接到服务器

来自分类Dev

Node.js服务器(移动客户端)

来自分类Dev

OpenSSL让服务器和客户端协商方法